我无法制作新标签,但它应该在MANAGEDCUDA标签上,因为我正在使用该框架在C#中使用CUDA。
我使用此代码分配2个INT数组进行测试:
Console.WriteLine("Cells: "+sum+" Expected Total Memory (x4): "+sum*4);
int temp= 0;
temp = cntxt.GetFreeDeviceMemorySize();
Console.Write("\n Memory available before:" + cntxt.GetFreeDeviceMemorySize() + "\n");
CudaDeviceVariable<int> matrix = new CudaDeviceVariable<int>(sum);
CudaDeviceVariable<int> matrixDir = new CudaDeviceVariable<int>(sum);
Console.Write("\n Memory available after allocation:" + cntxt.GetFreeDeviceMemorySize() + "\n");
Console.WriteLine("Memory took: "+(temp - cntxt.GetFreeDeviceMemorySize()));
Console.WriteLine("Diference between the expected and allocated: " + ((temp - cntxt.GetFreeDeviceMemorySize())-sum*8));
跑完后我在控制台得到了这个:
答案 0 :(得分:6)
当您通过分配器(malloc
,cudaMalloc
,...)分配内存时,它需要在特殊元数据结构中跟踪您分配的字节。例如,此元数据可能包含已分配的字节数及其在内存中的位置,一些用于对齐分配的填充以及缓冲区溢出检查。
为了减少管理开销,大多数现代分配器都使用 pages ,也就是说,它们以固定大小的不可分割的块分配内存。在许多主机系统上,此大小默认为4 kB。
在您的确切情况下,CUDA似乎以64 kB的页面为您的内存分配请求提供服务。也就是说,如果你请求56 kB,CUDA无论如何都会为你提供64 kB,而未使用的8 kB则是“浪费”(从应用程序的角度来看)。
当您请求分配1552516个字节(即23.7页)时,运行时将为您提供24页(1572864字节):额外的20348字节。加倍(因为你有2个数组),这就是你的40696字节差异的来源。
注意:页面大小因GPU和驱动程序版本而异。您可以尝试自己通过实验找到它,或者搜索其他人发布的结果。在任何情况下,这是(据我所知)没有记录,因此如果您打算将程序移植,可能不会依赖它。