我认为@lmortenson 是在正确的轨道上,但我们不会将宽度和高度乘以sizeof(float)
,而只是其中之一。
- 您需要确保您的
bmp.width
和bmp.height
参数符合此处指定的限制Valid extents
。这些范围是元素,而不是字节。
- 您需要将宽度和高度参数传递给元素中的cudaMallocArray ,而不是字节。
- 您需要将整体大小参数传递给cudaMemcpyToArray以字节为单位,而不是元素,但这通常采用以下形式
width*height*sizeof(float)
我根据您的代码创建了一个简单的复制器,并且能够重现 seg 错误。我相信以下代码是我对已修复错误的改编:
#include <stdio.h>
#define cudaCheckErrors(msg) \
do { \
cudaError_t __err = cudaGetLastError(); \
if (__err != cudaSuccess) { \
fprintf(stderr, "Fatal error: %s (%s at %s:%d)\n", \
msg, cudaGetErrorString(__err), \
__FILE__, __LINE__); \
fprintf(stderr, "*** FAILED - ABORTING\n"); \
exit(1); \
} \
} while (0)
int main(){
int width = 256;
int height = 256;
float *h_data = new float[width * height];
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat);
cudaArray *cArray;
cudaMallocArray(&cArray, &channelDesc, width, height, cudaArrayDefault);
cudaCheckErrors("cudaMallocArray");
cudaMemcpyToArray(cArray, 0, 0, h_data, width*height*sizeof(float), cudaMemcpyHostToDevice);
cudaCheckErrors("cudaMemcpyToArray");
return 0;
}