Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CUDA设备中的内存分配不是预期的_C#_Memory Management_Cuda - Fatal编程技术网

C# CUDA设备中的内存分配不是预期的

C# CUDA设备中的内存分配不是预期的,c#,memory-management,cuda,C#,Memory Management,Cuda,我不能创建新标记,但它应该在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.Ge

我不能创建新标记,但它应该在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));
Console.WriteLine(“单元格:+sum+”预期总内存(x4):“+sum*4”);
内部温度=0;
temp=cntxt.GetFreeDeviceMemorySize();
Console.Write(“\n以下可用内存:”+cntxt.GetFreeDeviceMemorySize()+“\n”);
CudaDeviceVariable矩阵=新CudaDeviceVariable(总和);
CudaDeviceVariable matrixDir=新的CudaDeviceVariable(总和);
Console.Write(“\n分配后可用的内存:”+cntxt.GetFreeDeviceMemorySize()+“\n”);
WriteLine(“内存占用:”+(temp-cntxt.GetFreeDeviceMemorySize());
WriteLine(“预期值和分配值之间的差异:”+((temp-cntxt.GetFreeDeviceMemorySize())-sum*8));
运行后,我在控制台中得到了以下信息:


当您通过分配器(
malloc
cudaMalloc
,…)分配内存时,它需要在特殊的元数据结构中跟踪您分配的字节。例如,此元数据可能包含分配的字节数及其在内存中的位置、一些用于对齐分配的填充以及缓冲区溢出检查

为了减少管理开销,大多数现代分配器使用页,也就是说,它们以固定大小的不可分割块分配内存。在许多主机系统上,此大小默认为4KB

在您的情况下,CUDA似乎以64KB的页面为您的内存分配请求提供服务。也就是说,如果您请求56KB,CUDA将为您提供64KB,而未使用的8KB是“浪费的”(从应用程序的角度来看)

当您请求分配1552516字节(即23.7页)时,运行时将为您提供24页(1572864字节):这是额外的20348字节。加倍(因为您有2个数组),这就是40696字节差异的来源

注意:页面大小因GPU和驱动程序版本而异。你可以试着自己通过实验找到答案,或者搜索其他人发布的结果。在任何情况下,(据我所知)这是没有文档记录的,因此,如果您希望您的程序是可移植的,可能不会依赖它


当您通过分配器(
malloc
cudaMalloc
,…)分配内存时,它需要在特殊的元数据结构中跟踪您分配的字节。例如,此元数据可能包含分配的字节数及其在内存中的位置、一些用于对齐分配的填充以及缓冲区溢出检查

为了减少管理开销,大多数现代分配器使用页,也就是说,它们以固定大小的不可分割块分配内存。在许多主机系统上,此大小默认为4KB

在您的情况下,CUDA似乎以64KB的页面为您的内存分配请求提供服务。也就是说,如果您请求56KB,CUDA将为您提供64KB,而未使用的8KB是“浪费的”(从应用程序的角度来看)

当您请求分配1552516字节(即23.7页)时,运行时将为您提供24页(1572864字节):这是额外的20348字节。加倍(因为您有2个数组),这就是40696字节差异的来源

注意:页面大小因GPU和驱动程序版本而异。你可以试着自己通过实验找到答案,或者搜索其他人发布的结果。在任何情况下,(据我所知)这是没有文档记录的,因此,如果您希望您的程序是可移植的,可能不会依赖它


问问题是一种习惯。我猜您想知道为什么在分配了大约3MB的数据之后,出现了大约40KB的差异?与分配相关的是粒度/开销,而且设备上运行着类似于操作系统的东西,它需要设备内存来执行自己的日常管理任务。回答问题的用户池已经相对有限,进一步拆分标签只会让你的问题变得不那么明显。问问题是习惯。我猜您想知道为什么在分配了大约3MB的数据之后,出现了大约40KB的差异?与分配相关的是粒度/开销,而且设备上运行着类似于操作系统的东西,它需要设备内存来执行自己的日常管理任务。回答问题的用户池已经相对有限,进一步拆分标签只会使您的问题不那么明显。