gpt4 book ai didi

c - 处理 CUDA 中指向指针的图像指针

转载 作者:行者123 更新时间:2023-11-30 15:34:38 25 4
gpt4 key购买 nike

我一直在尝试编写一个 CUDA 代码(部分取自 Yuval Fisher 的分形图像压缩),该代码具有指向 2D 图像的双指针。处理完 this 中的指针分配后,我仍然收到段错误错误以及“警告:无法判断指针指向什么,假设全局内存空间”警告。这是完整的code 。我也将其发布在这里,如下所示:(对于重复发布的代码,我深表歉意)

#include <cuda.h>
#include <stdio.h>
#include <stdlib.h>
#define hsize 256
#define vsize 256

#define IMAGE_TYPE unsigned char


__global__ void kernel(IMAGE_TYPE matrixin[][hsize], IMAGE_TYPE matrixout[][hsize]) {
int tid=threadIdx.x;
int bid=blockIdx.x;

matrixout[bid][tid]=matrixin[bid][tid];
}

int fatal(char* s) {
fprintf(stderr,"%s\n",s);
return 1;
}

#define matrix_allocate(matrix,hsize,vsize,TYPE) {\
TYPE *imptr;\
int _i;\
matrix=(TYPE**)malloc((vsize)*sizeof(TYPE*));\
imptr=(TYPE*)malloc((long)(hsize)*(long)(vsize)*sizeof(TYPE));\
if(imptr==NULL)\
fatal("\nNo memory in matrix allocate.");\
for(_i=0;_i<vsize;++_i,imptr+=hsize)\
matrix[_i] = imptr;\
}\


int main() {
typedef IMAGE_TYPE IMarray[vsize][hsize];
IMAGE_TYPE **hin_image,**hout_image;

IMarray *din_image,*dout_image;


//allocate host memory
matrix_allocate(hin_image,hsize,vsize,IMAGE_TYPE)
for(int i=0;i<vsize;i++)
for(int j=0;j<hsize;j++)
hin_image[i][j]='a';

matrix_allocate(hout_image,hsize,vsize,IMAGE_TYPE)


//allocate device memory

cudaMalloc((void**)&din_image,(vsize*hsize)*sizeof(IMAGE_TYPE));
cudaMalloc((void**)&dout_image,(vsize*hsize)*sizeof(IMAGE_TYPE));

cudaMemcpy(din_image,hin_image, (vsize*hsize)*sizeof(IMAGE_TYPE),cudaMemcpyHostToDevice);

dim3 threads(hsize,1,1);
dim3 blocks(vsize,1,1);

kernel<<<blocks,threads>>>(din_image,dout_image);

cudaMemcpy(hout_image,dout_image,(vsize*hsize)*sizeof(IMAGE_TYPE),cudaMemcpyDeviceToHost);

for(int i=0;i<10;i++) {
printf("\n");
for(int j=0;j<10;j++)
printf("%c\t",hout_image[i][j]);
}
printf("\n");

cudaFree(din_image);
cudaFree(dout_image);

free(hin_image);
free(hout_image);

return 0;
}

我想知道内核函数内图像的标准 2D 访问有什么问题。非常欢迎任何帮助。

最佳答案

我不会尝试整理你复杂的矩阵分配方案。我建议的目的是让您可以将事情简化为简单的 1 行分配。

此外,我认为您并没有真正理解我给出的例子。这是一个 3D 示例,typedef 有 2 个下标。 2D 版本将具有带有单个下标的 typedef。

实际上这一切都与 CUDA 无关。它围绕着对 C 数组和指针的理解。

这些是我为使您的代码正常运行而所做的主要更改:

#include <stdio.h>
#include <stdlib.h>
#define hsize 256
#define vsize 256

#define IMAGE_TYPE unsigned char


__global__ void kernel(IMAGE_TYPE matrixin[][hsize], IMAGE_TYPE matrixout[][hsize]) {
int tid=threadIdx.x;
int bid=blockIdx.x;

matrixout[bid][tid]=matrixin[bid][tid];
}

int fatal(char* s) {
fprintf(stderr,"%s\n",s);
return 1;
}


int main() {
typedef IMAGE_TYPE IMarray[hsize];
IMarray *hin_image,*hout_image;

IMarray *din_image,*dout_image;


//allocate host memory
hin_image = (IMarray *)malloc(hsize*vsize*sizeof(IMAGE_TYPE));
hout_image = (IMarray *)malloc(hsize*vsize*sizeof(IMAGE_TYPE));

for(int i=0;i<vsize;i++)
for(int j=0;j<hsize;j++)
hin_image[i][j]='a';


//allocate device memory

cudaMalloc((void**)&din_image,(vsize*hsize)*sizeof(IMAGE_TYPE));
cudaMalloc((void**)&dout_image,(vsize*hsize)*sizeof(IMAGE_TYPE));
cudaMemset(dout_image, 0, (vsize*hsize)*sizeof(IMAGE_TYPE));
cudaMemcpy(din_image,hin_image, (vsize*hsize)*sizeof(IMAGE_TYPE),cudaMemcpyHostToDevice);

dim3 threads(hsize,1,1);
dim3 blocks(vsize,1,1);

kernel<<<blocks,threads>>>(din_image,dout_image);

cudaMemcpy(hout_image,dout_image,(vsize*hsize)*sizeof(IMAGE_TYPE),cudaMemcpyDeviceToHost);

for(int i=0;i<10;i++) {
printf("\n");
for(int j=0;j<10;j++)
printf("%c\t",hout_image[i][j]);
}
printf("\n");

cudaFree(din_image);
cudaFree(dout_image);

free(hin_image);
free(hout_image);

return 0;
}

关于c - 处理 CUDA 中指向指针的图像指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23204820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com