3

来电:

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

4

1 回答 1

4

是的,范围大小有限制 - 2048x2048x2048 或 4096x4096x4096,具体取决于您拥有的硬件(根据您问题中的详细信息,我假设您有 Fermi 卡)。但你问题的真正根源是你的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); 

在这个调用中,类型的大小是从通道描述中推断出来的,并且根据需要修改范围尺寸以满足硬件的间距/对齐要求。

于 2013-02-05T19:10:09.867 回答