cudaMemcpy2D的尺寸是否有限?

cudaMemcpy2D的尺寸是否有限?,cuda,nvidia,Cuda,Nvidia,我一直在使用cudaMemcpy2D将一个20*20字符值的2D数组发送到我的内核,但是当我想尝试发送一个20*30的数组时,出现了一个错误 这些行的代码如下所示: 我这样定义常量: //Define for 2D arrays #define TEXTSIZE 20 #define NUMBERTEXT 30 我这样定义我的文本音高 size_t pitch_text; 我按如下方式初始化阵列: char text[NUMBERTEXT][TEXTSIZE] = {{'A','A','B'

我一直在使用cudaMemcpy2D将一个20*20字符值的2D数组发送到我的内核,但是当我想尝试发送一个20*30的数组时,出现了一个错误

这些行的代码如下所示:

我这样定义常量:

//Define for 2D arrays
#define TEXTSIZE 20
#define NUMBERTEXT 30
我这样定义我的文本音高

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'},\ ... }};
gpuErrchk(cudaMallocPitch( (void**)&d_text, &pitch_text, NUMBERTEXT * sizeof(char), TEXTSIZE));
gpuErrchk(cudaMemcpy2D(d_text, pitch_text, text, TEXTSIZE * sizeof(char), TEXTSIZE * sizeof(char),NUMBERTEXT, cudaMemcpyHostToDevice));
我的Cudamaloc是这样做的:

char text[NUMBERTEXT][TEXTSIZE] = {{'A','A','B','C','B','B','C','A','B','A','A','B','B','A','A','A','C','A','A','B'},\ ... }};
gpuErrchk(cudaMallocPitch( (void**)&d_text, &pitch_text, NUMBERTEXT * sizeof(char), TEXTSIZE));
gpuErrchk(cudaMemcpy2D(d_text, pitch_text, text, TEXTSIZE * sizeof(char), TEXTSIZE * sizeof(char),NUMBERTEXT, cudaMemcpyHostToDevice));
CudaMemcpy2D的初始化如下:

char text[NUMBERTEXT][TEXTSIZE] = {{'A','A','B','C','B','B','C','A','B','A','A','B','B','A','A','A','C','A','A','B'},\ ... }};
gpuErrchk(cudaMallocPitch( (void**)&d_text, &pitch_text, NUMBERTEXT * sizeof(char), TEXTSIZE));
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数组,代码运行良好


谢谢

问题出在您的呼叫中(不是在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);
CudamAllocPicch的最后一个参数是
请求的倾斜分配高度
,即rows参数

编辑:为了回答评论中的进一步问题,这里是我用于测试目的的代码。特别是关于文本数组大小的问题,对于大小高达90x120左右的代码,我无法使用此代码重现segfault。因此,我认为SEGFULT可能是一个单独的问题

我的测试代码(不存在故障):

#包括
//为二维阵列定义
#定义文本大小90
#定义数字文本120
#定义cudaCheckErrors(msg)\
做{\
cudaError\u t\u err=cudaGetLastError()\
如果(_err!=cudaSuccess){\
fprintf(标准,“致命错误:%s(%s位于%s:%d)\n”\
msg,cudaGetErrorString(_err)\
__文件(行)\
fprintf(stderr,“***失败-中止\n”)\
出口(1)\
} \
}而(0)
int main(){
大小、间距、文字;
字符*d_文本;
字符文本[NUMBERTEXT][TEXTSIZE];
cudaMallocPitch((void**)和d_文本,以及pitch_文本,TEXTSIZE*sizeof(char),NUMBERTEXT);
cudaCheckErrors(“cudamallocitch错误”);
cudaMemcpy2D(d_文本、音高_文本、文本、TEXTSIZE*sizeof(char)、TEXTSIZE*sizeof(char)、NUMBERTEXT、cudamemcpyhostodevice);
cudaCheckErrors(“cudaMemcpy2D错误”);
返回0;
}

soo它是
char TEXT[NUMBERTEXT][TEXTSIZE]
。我说得对吗?或者它们是不同的常数?它的大小不限于20 x 20。您在使用电话时犯了一个错误,但您没有提供足够的信息来说明问题所在。请提供您所做工作的更完整定义,包括所有常量、所有变量定义的定义,以及完整的cudamallocpatch和cudaMemcpy调用。请注意,您定义的是一个
char TEXT[][]
,但传递的是一个小写变量
TEXT
,因此我认为这不会像所写的那样起作用。@RobertCrovella那么大小在
cudaMemcpy2D
中的位置是正确的吗?@SorooshBateni我认为是这样。在C语言中,多维数组的下标为
array[rows][columns]
,其中
columns
给出数组在元素中的宽度。@RobertCrovella-Aha,谢谢。这确实有意义!谢谢你的帮助!虽然有一次,你得到了超过20*70的字符数组,但是你得到了一个分段错误。我用你提供的代码编写了一个简单的程序。对于较大的值,如20 x70或90 x 80,它不会出现故障。是否隔离了发生SEG故障的线路?如果你需要帮助,你可能想发布一个新问题。它与这个主题不相关吗?因为当我将NUMBERTEXT更改为120时,它会给我一个segfault,而且问题行似乎是cudamallocitch()。我认为除了您所做的NUMBERTEXT和TEXTSIZE错误的交换之外,可能还有其他问题。因此,在我看来,如果我们有集中的问题和答案,效果最好。当您调试代码时,它不是为来回对话而设计的。这就是为什么我建议开始一个新问题。不管怎样,我已经发布了一个简单的代码,用来测试我的工作。如果您有segfault问题,我的建议是查看您机器上的代码,看看它是否存在segfault。如果没有,请尝试将代码简化为一个同样简单的示例。