我是CUDA领域的初学者。 我想在x帧(8位b& w)上执行简单的朴素平均以降低噪声(或中位数)。 你如何建议为X图像分配内存?
这样可以吗?
unsigned char** dev_imageStack = new unsigned char*[X];
for(int i = 0; i < X; i++)
{
cudaMalloc( (void**) &dev_imageStack[i], imageSize);
}
非常感谢, IDO
答案 0 :(得分:1)
它取决于dev_imageStack的使用。 dev_imageStack是指向CPU内存的指针,用于存储指向GPU内存的指针。您将无法将dev_imageStack传递给内核并从中读取内核,而您的内核最可能崩溃。你可以将dev_imageStack [0] .. dev_imageStack [X]传递给你的内核,因为那是一个指向GPU内存的指针。
如果你需要用指针传递所有帧,我建议分配一个数组并在内核中执行帧偏移以获得正确的帧。
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);
现在您可以使用dev_imageStack作为指向内核的2D指针。访问帧和像素将通过在内核中调用dev_imageStack [frame_id] [pixel_id]来完成。
答案 1 :(得分:0)
在一个自己的项目中,我通过这种方式解决了这个问题:
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;
我只分配了一个大内存块,并使用指向几个“子块”的指针。
如果你想要一个包含指向“子块”的指针的数组,你可以这样做。
void* dev_images;
cudaMalloc( (void**)&dev_images_tmp, frames * sizeof( unsigned char* ) );
unsigned char** dev_images = (unsigned char**)dev_images_tmp;
现在在内核中你可以用这种方式调用第x帧的图像:
dev_images[x][index];
使用索引,您可以获取目标图像的元素。