通话:
cudaExtent extent = make_cudaExtent( 1920 * sizeof(float), 1080, 10);
chanDesc = cudaCreateChannelDesc ( 32, 0, 0, 0, cudaChannelFormatKindFloat);
err = cudaMalloc3DArray ( &(devYAll[0]), &chanDesc, extent, 0);
与err=cudaErrorInvalidValue
失败。当我使用第一个争论扩展到1024或更小时,对3D阵列的调用成功。是否以某种方式限制了可以使用cudaMalloc3DArray
分配的内存大小?
答案 0 :(得分:3)
是的,范围大小有限制 - 2048x2048x2048或4096x4096x4096,具体取决于您拥有的硬件(根据您的问题中的详细信息,我认为您有费米卡)。但问题的真正来源是make_cudaExtent
电话。对于cudaMalloc3DArray
,范围的第一个参数应该在元素中给出,而不是字节。这就是为什么你得到第一个维度的错误> 1024,1024 * sizeof(float)= 4096,这是Fermi GPU的极限。
所以要分配一个1920x1080x10的3D阵列,请执行以下操作:
cudaExtent extent = make_cudaExtent( 1920, 1080, 10);
chanDesc = cudaCreateChannelDesc ( 32, 0, 0, 0, cudaChannelFormatKindFloat);
err = cudaMalloc3DArray ( &(devYAll[0]), &chanDesc, extent, 0);
在此调用中,从通道描述中推断出类型的大小,并根据需要修改范围尺寸以满足硬件的间距/对齐要求。