cudaMemcpy2D的尺寸有限吗?

时间:2013-03-04 17:42:10

标签: cuda nvidia

我一直在使用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阵列,代码工作正常。

谢谢

1 个答案:

答案 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;
}