如何在cuda中分配映像堆栈

如何在cuda中分配映像堆栈,cuda,Cuda,我是CUDA领域的初学者。 我想对x帧(8位黑白)执行简单的朴素平均,以减少噪声(或中值)。 您建议如何为X图像分配内存 这样行吗 unsigned char** dev_imageStack = new unsigned char*[X]; for(int i = 0; i < X; i++) { cudaMalloc( (void**) &dev_imageStack[i], imageSize); } unsigned cha

我是CUDA领域的初学者。 我想对x帧(8位黑白)执行简单的朴素平均,以减少噪声(或中值)。 您建议如何为X图像分配内存

这样行吗

    unsigned char** dev_imageStack = new unsigned char*[X];
    for(int i = 0; i < X; i++)
    {
        cudaMalloc( (void**) &dev_imageStack[i], imageSize);
    }
unsigned char**dev_imageStack=新的unsigned char*[X];
对于(int i=0;i
谢谢你,
我在自己的一个项目中通过以下方式解决了这个问题:

unsigned char* dev_imageStack;
cudaMalloc( (void**)&dev_imageStack, imageSize * frames );

unsigned char* dev_image1 = dev_imageStack;
unsigned char* dev_image2 = dev_image1 + imageSize;
...
unsigned char* dev_imageN = dev_imageN-1 + imageSize;
dev_images[x][index];
我只分配了一个大内存块,并使用指向几个“子块”的指针

如果你想要一个数组,其中包含指向“子块”的指针,你可以这样做

void* dev_images;
cudaMalloc( (void**)&dev_images_tmp, frames * sizeof( unsigned char* ) );
unsigned char** dev_images = (unsigned char**)dev_images_tmp;
现在,在内核中,您可以通过以下方式调用帧x的映像:

unsigned char* dev_imageStack;
cudaMalloc( (void**)&dev_imageStack, imageSize * frames );

unsigned char* dev_image1 = dev_imageStack;
unsigned char* dev_image2 = dev_image1 + imageSize;
...
unsigned char* dev_imageN = dev_imageN-1 + imageSize;
dev_images[x][index];

使用索引,您可以获取目标集映像的元素。

它取决于dev_imageStack的使用。dev_imageStack是一个指向CPU内存的指针,其中包含指向GPU内存的指针。您将无法将dev_imageStack传递给内核并从中读取,您的内核很可能会崩溃。您可以传递dev_imageStack[0]。。dev_imageStack[X]指向内核,因为它是指向GPU内存的指针

如果需要用指针传递所有帧,我建议分配一个1D数组,并在内核中执行帧偏移以获得正确的帧

unsigned char* dev_imageStack;
cudaMalloc((void**)&dev_imageStack, imageSize*X);
当您使用它时,您应该通过偏移到Y*imageSize的数组中来访问帧,其中Y是您要访问的帧

如果您想按照您描述的方式进行操作,则必须按照以下方式进行:

unsigned char** host_imageStack = new unsigned char*[X];

for(int i = 0; i < X; i++)
{
    cudaMalloc( (void**) &host_imageStack[i], imageSize*sizeof(char));
    cudaMemcpy(host_imageStack[i], "char_ptr_to_frame_i_on_host", imageSize*sizeof(char),cudaMemcpyHostToDevice);
}

unsigned char** dev_imageStack;
cudaMalloc((void**)&dev_imageStack, X*sizeof(char*));
cudaMemcpy(dev_imageStack,host_imageStack,X*sizeof(char*),cudaMemcpyHostToDevice);
unsigned char**host_imageStack=新的unsigned char*[X];
对于(int i=0;i

现在您可以使用dev_imageStack作为指向内核的2D指针。访问帧和像素将通过在内核中调用dev_imageStack[frame_id][pixel_id]来完成。

在编译时,我不知道X,所以我必须使用您的第二个建议(cudamaloc((void**)和dev_imageStack,imageSize*X)现在我想我们应该在主机上添加一个for循环分配数据,另一个循环从主机图像复制到设备图像。“代码”为(int i=0;i < x){cUdAMEMcPy(& DeViVixEtC++)[I],host_imageStack[i],sizeof(char)*imagesize,主机映像[i],imagesize,主机映像[i],映像大小,主机映像[i],映像大小只是澄清一下。host_imageStack是CPU上的指针,但host_imageStack[i]是GPU内存的地址。啊,好的。我在自己的项目中使用了一些可比较的,我会更新我的答案,告诉我如何解决这个问题。