在opengl纹理上操作时出现cudaMemcpyToArray问题

在opengl纹理上操作时出现cudaMemcpyToArray问题,cuda,Cuda,我试图将GPU上的数组中的数据写入OpenGL纹理,但在cudaMemcpyToArray上出现“无效参数”错误 unsigned int id; unsigned int width = 600, height = 600; glGenTextures(1, &id); glBindTexture(GL_TEXTURE_2D, id); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexP

我试图将GPU上的数组中的数据写入OpenGL纹理,但在cudaMemcpyToArray上出现“无效参数”错误

unsigned int id;
unsigned int width = 600, height = 600;

glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);


cudaGraphicsResource *cgr;
cudaCall(cudaGraphicsGLRegisterImage(&cgr, id, GL_TEXTURE_2D, cudaGraphicsMapFlags::cudaGraphicsMapFlagsNone));
cudaCall(cudaGraphicsMapResources(1, &cgr));
cudaArray *arr;
cudaCall(cudaGraphicsSubResourceGetMappedArray(&arr, cgr, 0, 0));

unsigned int *d_display;
size_t d_displayS = width * height * 3;
size_t d_displaySB = d_displayS * sizeof(int);
cudaCall(cudaMalloc(&d_display, d_displaySB));

someKernel <<<d_displayS, 1>>> (d_display);
cudaCall(cudaDeviceSynchronize());

cudaCall(cudaMemcpyToArray(arr, 0, 0, d_display, d_displaySB, cudaMemcpyKind::cudaMemcpyDeviceToDevice));

cudaCall(cudaGraphicsUnmapResources(1, &cgr));
unsigned int-id;
无符号整数宽度=600,高度=600;
glGenTextures(1,&id);
glBindTexture(GL_纹理_2D,id);
glTexParameteri(GL\u纹理\u 2D,GL\u纹理\u最小\u过滤器,GL\u最近);
glTexParameteri(GL_纹理2D,GL_纹理MAG_过滤器,GL_最近);
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹紧_至_边缘);
glTexParameteri(GL_纹理\u 2D、GL_纹理\u包裹\u T、GL_夹紧\u至\u边缘);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGB8,宽度,高度,0,GL_RGB,GL_无符号_字节,NULL);
cudaGraphicsResource*cgr;
cudaCall(cudaGraphicsGLRegisterImage(&cgr,id,GL_TEXTURE_2D,cudaGraphicsMapFlags::cudaGraphicsMapFlagsNone));
cudaCall(cudaGraphicsMapResources(1和cgr));
cudaArray*arr;
cudaCall(cudagraphicsubresourcegetmappedarray(&arr,cgr,0,0));
无符号整数*d_显示;
尺寸显示=宽度*高度*3;
大小显示b=d显示*sizeof(int);
cudaCall(cudamaloc(&d_display,d_displaySB));
someKernel(d_显示);
cudaCall(cudaDeviceSynchronize());
cudaCall(cudaMemcpyToArray(arr、0、0、d_显示、d_显示b、cudaMemcpyKind::cudamemcpydevicetodedevice));
cudaCall(cudaGraphicsUnmapResources(1和cgr));

您的GL纹理正在指定每个组件8位的RGB格式:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
因此,每个纹理元素应该有3个字节。这是以字节为单位的大小的正确计算:

size_t d_displayS = width * height * 3;
但实际上,你可以将其乘以4:

size_t d_displaySB = d_displayS * sizeof(int);
                                ^^^^^^^^^^^^^^
要在复制操作中使用:

cudaCall(cudaMemcpyToArray(arr, 0, 0, d_display, d_displaySB, cudaMemcpyKind::cudaMemcpyDeviceToDevice));
                                                 ^^^^^^^^^^^
这是不正确的。如果将上述定义更改为:

size_t d_displaySB = d_displayS;

然后,根据我的测试,您的
cudaMemcpyToArray
调用不会返回错误。

您的GL纹理指定了一种RGB格式,每个组件8位:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
因此,每个纹理元素应该有3个字节。这是以字节为单位的大小的正确计算:

size_t d_displayS = width * height * 3;
但实际上,你可以将其乘以4:

size_t d_displaySB = d_displayS * sizeof(int);
                                ^^^^^^^^^^^^^^
要在复制操作中使用:

cudaCall(cudaMemcpyToArray(arr, 0, 0, d_display, d_displaySB, cudaMemcpyKind::cudaMemcpyDeviceToDevice));
                                                 ^^^^^^^^^^^
这是不正确的。如果将上述定义更改为:

size_t d_displaySB = d_displayS;
然后,根据我的测试,您的
cudaMemcpyToArray
调用不会返回错误