我正在开发一个使用Titan Z上的两个GPU的程序,当分配的内存总量小于6 GB(即每张卡上<3GB)时,它可以正常工作。
然而,当我使用超过6 GB时,任何CUDA启动之间都会有非常长的停顿,无论每个GPU上分配多少内存,如果组合数量大于6 GB,性能将降至零,因为摊位。
在检查cudaMemGetInfo()可用的内存量时,我发现两个GPU的数量相同。测试代码如下
for(int j=0; j<gnum; j++)
{
cudaSetDevice(j);
cudaMemGetInfo(&freeMemory, &totalMemory);
printf("Device memory = %lli \n", totalMemory);
printf("Available memory = %lli \n", freeMemory);
}
for(int i=0; i<gnum; i++)
{
cudaSetDevice(i);
cudaMalloc(&d[i], 1024*1024*1024);
for(int j=0; j<gnum; j++)
{
cudaSetDevice(j);
cudaMemGetInfo(&freeMemory, &totalMemory);
printf("Device memory = %lli \n", totalMemory);
printf("Available memory = %lli \n", freeMemory);
}
}
我得到了
Device memory = 644250944
GPU 0 Available memory = 5272363008
Device memory = 644250944
GPU 1 Available memory = 5195358208
GPU 0 Available memory = 4121616384
GPU 1 Available memory = 4121616384
GPU 0 Available memory = 3047874560
GPU 1 Available memory = 3047874560
因此看起来两个GPU都使用相同的6GB内存而不是每个6GB内存上的一个。我正在使用Windows 8.1 64位并使用WDDM,如果这有所不同。