NVIDIA
4x K520 on AWS, need multi monitor support
How can I enable monitors on all four of the K520 cards? I need 3840 x 2400. It only shows 1 monitor connected which maxes out at 2560x1600.
How can I enable monitors on all four of the K520 cards? I need 3840 x 2400. It only shows 1 monitor connected which maxes out at 2560x1600.

#1
Posted 12/01/2016 10:18 PM   
I [i]believe[/i] the GRID K520 is rated at 2560 x 1600 resolution. It's an old model now. In order to push 4K, you'll need a different Card. The GRID K2 supports 4K in Passthrough if you are looking for one that can support multiple users. If you could give us more information, we may be able to suggest additional options. Regards Ben
I believe the GRID K520 is rated at 2560 x 1600 resolution. It's an old model now. In order to push 4K, you'll need a different Card.

The GRID K2 supports 4K in Passthrough if you are looking for one that can support multiple users.

If you could give us more information, we may be able to suggest additional options.

Regards

Ben

#2
Posted 12/02/2016 09:01 AM   
To be clear, I have [u]four [/u] GRID K520 in my system therefore I should get four times 2560x1600 yet, it will only recognize one monitor on the first card. All I need is it it to recognize one monitor per card and I will be golden.
To be clear, I have four GRID K520 in my system therefore I should get four times 2560x1600 yet, it will only recognize one monitor on the first card. All I need is it it to recognize one monitor per card and I will be golden.

#3
Posted 12/03/2016 01:21 AM   
I think that only the first monitor on the first card is enabled by nvidia-bios/drivers on cards without real outputs (headless). If you need more monitors you must supply valid EDID to "connect" monitor. The EDID data is usually set by some type of remote display solution but most protocols support more monitors on [u]one card[/u] and not multi cards. You can test this problem and setup EDID with following code (from "Displayless Multi-GPU on Windows.pdf"). You need VisualStudio C compiler (free VS Express 2013 for Desktop is OK) and free NVAPI. [code] #include <windows.h> #include <stdio.h> #include "NvAPI/NvAPI.h" // 0 unsigned char testEDID[128] = { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x10, 0xAC, 0x7A, 0xA0, 0x4C, 0x50, 0x32, 0x32, 0x0D, 0x17, 0x01, 0x03, 0x80, 0x34, 0x20, 0x78, 0xEA, 0xEE, 0x95, 0xA3, 0x54, 0x4C, 0x99, 0x26, 0x0F, 0x50, 0x54, 0xA1, 0x08, 0x00, 0x81, 0x40, 0x81, 0x80, 0xA9, 0x40, 0xB3, 0x00, 0xD1, 0xC0, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x28, 0x3C, 0x80, 0xA0, 0x70, 0xB0, 0x23, 0x40, 0x30, 0x20, 0x36, 0x00, 0x06, 0x44, 0x21, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x30, 0x46, 0x46, 0x58, 0x44, 0x33, 0x33, 0x54, 0x32, 0x32, 0x50, 0x4C, 0x0A, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x44, 0x45, 0x4C, 0x4C, 0x20, 0x55, 0x32, 0x34, 0x31, 0x32, 0x4D, 0x0A, 0x20, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x32, 0x3D, 0x1E, 0x53, 0x11, 0x00, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x45 }; int main(int argc, char* argv[]) { NvAPI_Status ret = NVAPI_OK; NvU32 nDisplayIds = 0; NvU32 physicalGpuCount = 0; NV_GPU_DISPLAYIDS pDisplayIds[NVAPI_MAX_DISPLAYS]; NvPhysicalGpuHandle hPhysicalGpu[NVAPI_MAX_PHYSICAL_GPUS]; NV_EDID edid; // 1 ret = NvAPI_Initialize(); if (ret != NVAPI_OK) return -1; // Enumerate the physical GPU handle and get the DisplayID ret = NvAPI_EnumPhysicalGPUs(hPhysicalGpu, &physicalGpuCount); if (ret != NVAPI_OK) return -1; // Query the total number of Display IDs printf("physicals: %d\n", physicalGpuCount); ret = NvAPI_GPU_GetAllDisplayIds(hPhysicalGpu[0], NULL, &nDisplayIds); if (ret != NVAPI_OK) return -1; // Retrieve all of the Display IDs into pDisplayIDs printf("displays on physical[0]: %d\n", nDisplayIds); pDisplayIds[0].version = NV_GPU_DISPLAYIDS_VER; ret = NvAPI_GPU_GetAllDisplayIds(hPhysicalGpu[0], pDisplayIds, &nDisplayIds); if (ret != NVAPI_OK) return -1; // 2 memset(&edid, 0, sizeof(edid)); edid.version = NV_EDID_VER; memcpy(edid.EDID_Data, testEDID, sizeof(testEDID)); edid.sizeofEDID = sizeof(testEDID); // to set EDID (it is persistent between reboots) //edid.sizeofEDID = 0; // to remove EDID printf("NvAPI_GPU_SetEDID for physical[0] display[1]\n"); ret = NvAPI_GPU_SetEDID(hPhysicalGpu[0], pDisplayIds[1].displayId, &edid); if (ret != NVAPI_OK) { printf("NvAPI_GPU_SetEDID failed = %d\n", ret); return -1; } printf("NvAPI_GPU_SetEDID success\n"); // 3 ret = NvAPI_GPU_GetConnectedDisplayIds(hPhysicalGpu[0], NULL, &nDisplayIds, NV_GPU_CONNECTED_IDS_FLAG_FAKE); if (ret != NVAPI_OK) return -1; // Retrieve Display IDs from connected displays ret = NvAPI_GPU_GetConnectedDisplayIds(hPhysicalGpu[0], pDisplayIds, &nDisplayIds, NV_GPU_CONNECTED_IDS_FLAG_FAKE); if (ret != NVAPI_OK) return -1; printf("connected monitors on physical[0]: %d\n", nDisplayIds); return 0; } [/code] // 0 - sample EDID is for DELL U2412M monitor 1920x1200 // 1 - get count about physical gpu card and "all displays" (monitors) of one physical[0] (you should get NvAPI_GPU_GetAllDisplayIds() for 1,2,3) // 2 - setup EDID on physical[0]+display[1] (you should NvAPI_GPU_SetEDID() for 1+0,2+0,3+0) - setup is persistent between reboots - edid.sizeofEDID=0 remove EDID (eg. disconnect monitor) // 3 - get count of "connected displays" Happy hacking, M.C>
I think that only the first monitor on the first card is enabled by nvidia-bios/drivers on cards without real outputs (headless). If you need more monitors you must supply valid EDID to "connect" monitor.
The EDID data is usually set by some type of remote display solution but most protocols support more monitors on one card and not multi cards.
You can test this problem and setup EDID with following code (from "Displayless Multi-GPU on Windows.pdf"). You need VisualStudio C compiler (free VS Express 2013 for Desktop is OK) and free NVAPI.

#include <windows.h>
#include <stdio.h>
#include "NvAPI/NvAPI.h"

// 0
unsigned char testEDID[128] = { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x10, 0xAC, 0x7A, 0xA0, 0x4C, 0x50, 0x32, 0x32, 0x0D, 0x17, 0x01, 0x03, 0x80, 0x34, 0x20, 0x78, 0xEA, 0xEE, 0x95, 0xA3, 0x54, 0x4C, 0x99, 0x26, 0x0F, 0x50, 0x54, 0xA1, 0x08, 0x00, 0x81, 0x40, 0x81, 0x80, 0xA9, 0x40, 0xB3, 0x00, 0xD1, 0xC0, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x28, 0x3C, 0x80, 0xA0, 0x70, 0xB0, 0x23, 0x40, 0x30, 0x20, 0x36, 0x00, 0x06, 0x44, 0x21, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x30, 0x46, 0x46, 0x58, 0x44, 0x33, 0x33, 0x54, 0x32, 0x32, 0x50, 0x4C, 0x0A, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x44, 0x45, 0x4C, 0x4C, 0x20, 0x55, 0x32, 0x34, 0x31, 0x32, 0x4D, 0x0A, 0x20, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x32, 0x3D, 0x1E, 0x53, 0x11, 0x00, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x45 };

int main(int argc, char* argv[]) {
NvAPI_Status ret = NVAPI_OK;
NvU32 nDisplayIds = 0;
NvU32 physicalGpuCount = 0;
NV_GPU_DISPLAYIDS pDisplayIds[NVAPI_MAX_DISPLAYS];
NvPhysicalGpuHandle hPhysicalGpu[NVAPI_MAX_PHYSICAL_GPUS];
NV_EDID edid;

// 1
ret = NvAPI_Initialize();
if (ret != NVAPI_OK) return -1; // Enumerate the physical GPU handle and get the DisplayID
ret = NvAPI_EnumPhysicalGPUs(hPhysicalGpu, &physicalGpuCount);
if (ret != NVAPI_OK) return -1; // Query the total number of Display IDs
printf("physicals: %d\n", physicalGpuCount);
ret = NvAPI_GPU_GetAllDisplayIds(hPhysicalGpu[0], NULL, &nDisplayIds);
if (ret != NVAPI_OK) return -1; // Retrieve all of the Display IDs into pDisplayIDs
printf("displays on physical[0]: %d\n", nDisplayIds);
pDisplayIds[0].version = NV_GPU_DISPLAYIDS_VER;
ret = NvAPI_GPU_GetAllDisplayIds(hPhysicalGpu[0], pDisplayIds, &nDisplayIds);
if (ret != NVAPI_OK) return -1;

// 2
memset(&edid, 0, sizeof(edid));
edid.version = NV_EDID_VER;
memcpy(edid.EDID_Data, testEDID, sizeof(testEDID));
edid.sizeofEDID = sizeof(testEDID); // to set EDID (it is persistent between reboots)
//edid.sizeofEDID = 0; // to remove EDID
printf("NvAPI_GPU_SetEDID for physical[0] display[1]\n");
ret = NvAPI_GPU_SetEDID(hPhysicalGpu[0], pDisplayIds[1].displayId, &edid);
if (ret != NVAPI_OK) { printf("NvAPI_GPU_SetEDID failed = %d\n", ret); return -1; }
printf("NvAPI_GPU_SetEDID success\n");

// 3
ret = NvAPI_GPU_GetConnectedDisplayIds(hPhysicalGpu[0], NULL, &nDisplayIds, NV_GPU_CONNECTED_IDS_FLAG_FAKE);
if (ret != NVAPI_OK) return -1; // Retrieve Display IDs from connected displays
ret = NvAPI_GPU_GetConnectedDisplayIds(hPhysicalGpu[0], pDisplayIds, &nDisplayIds, NV_GPU_CONNECTED_IDS_FLAG_FAKE);
if (ret != NVAPI_OK) return -1;
printf("connected monitors on physical[0]: %d\n", nDisplayIds);

return 0;
}


// 0 - sample EDID is for DELL U2412M monitor 1920x1200
// 1 - get count about physical gpu card and "all displays" (monitors) of one physical[0] (you should get NvAPI_GPU_GetAllDisplayIds() for 1,2,3)
// 2 - setup EDID on physical[0]+display[1] (you should NvAPI_GPU_SetEDID() for 1+0,2+0,3+0)
- setup is persistent between reboots
- edid.sizeofEDID=0 remove EDID (eg. disconnect monitor)
// 3 - get count of "connected displays"

Happy hacking, M.C>

#4
Posted 12/03/2016 04:25 PM   
Scroll To Top

Add Reply