我一直在使用cudaMemcpy2D将20 * 20个char值的2D数组发送到我的内核,但是当我想尝试发送20 * 30的数组时,会出现错误。
这些行的代码如下:
我定义了这样的常量:
//Define for 2D arrays
#define TEXTSIZE 20
#define NUMBERTEXT 30
我像这样定义我的textPitch
size_t pitch_text;
我像这样初始化我的数组:
char text[NUMBERTEXT][TEXTSIZE] = {{'A','A','B','C','B','B','C','A','B','A','A','B','B','A','A','A','C','A','A','B'},\ ... }};
我像这样做我的cudamalloc:
gpuErrchk(cudaMallocPitch( (void**)&d_text, &pitch_text, NUMBERTEXT * sizeof(char), TEXTSIZE));
CudaMemcpy2D初始化如下:
gpuErrchk(cudaMemcpy2D(d_text, pitch_text, text, TEXTSIZE * sizeof(char), TEXTSIZE * sizeof(char),NUMBERTEXT, cudaMemcpyHostToDevice));
,收到的错误如下:
GPUassert: invalid argument ../2D.cu 212
第212行的错误基本上是CudaMemcpy2D行。
有没有更好的方法将大型2D阵列发送到全局内存中的GPU?请注意,如果我使用20 * 20阵列,代码工作正常。
谢谢
答案 0 :(得分:1)
问题出在您cudaMallocPitch的电话中(不在cudaMemcpy2D中)。您反转了高度和宽度参数。在C中,双重下标数组声明为array[rows][columns]
,其中columns
(即第二个下标)指的是宽度。
解决这个问题,而不是:
cudaMallocPitch( (void**)&d_text, &pitch_text, NUMBERTEXT * sizeof(char), TEXTSIZE);
这样做:
cudaMallocPitch( (void**)&d_text, &pitch_text, TEXTSIZE * sizeof(char), NUMBERTEXT);
cudaMallocPitch的最后一个参数是Requested pitched allocation height
,即rows参数。
编辑:要回复评论中的其他问题,这里是我用于测试目的的代码。特别是关于文本数组大小的问题,我无法使用此代码重现段大小为90x120左右的段错误。因此,我认为段错可能是一个单独的问题。
我的测试代码(不是段错):
#include <stdio.h>
//Define for 2D arrays
#define TEXTSIZE 90
#define NUMBERTEXT 120
#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(){
size_t pitch_text;
char *d_text;
char text[NUMBERTEXT][TEXTSIZE];
cudaMallocPitch( (void**)&d_text, &pitch_text, TEXTSIZE * sizeof(char), NUMBERTEXT);
cudaCheckErrors("cudaMallocPitch error");
cudaMemcpy2D(d_text, pitch_text, text, TEXTSIZE * sizeof(char), TEXTSIZE * sizeof(char),NUMBERTEXT, cudaMemcpyHostToDevice);
cudaCheckErrors("cudaMemcpy2D error");
return 0;
}