0

我一直在使用 cudaMemcpy2D 将 2D 数组从 20 * 20 字符值发送到我的内核,但是当我想尝试发送 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 行。

有没有更好的方法将大型二维数组发送到全局内存中的 GPU?请注意,如果我使用 20 * 20 数组,代码可以正常工作。

谢谢

4

1 回答 1

1

问题在于您对cudaMallocPitch的调用(不在 cudaMemcpy2D 中)。您颠倒了高度和宽度参数。在 C 中,双下标数组的声明类似于array[rows][columns]where 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;
}
于 2013-03-04T19:16:04.933 回答