我正在编写一个在图像上应用卷积矩阵的OpenCL程序。如果我将所有像素存储在数组image[height*width][4]
(第65行,评论)(抱歉,我说西班牙语,我的代码主要使用西班牙语),一切正常。但是,由于我正在使用的图像非常大,我需要动态分配内存。我执行代码,我收到Segmentation fault
错误。
在一些穷人的调试之后,我发现在执行内核并将输出图像读回主机后出现问题,将数据存储到动态分配的数组中。我只是无法获取错误而无法访问数组的数据。
我认为问题在于clEnqueueReadImage
函数(第316行)将图像数据写入image
数组的方式。此数组是动态分配的,因此它没有预定义的“结构”。
但我需要一个解决方案,我无法找到它,也无法在我自己或互联网上找到它。
C程序和OpenCL内核在这里: https://gist.github.com/MigAGH/6dd0fddfa09f5aabe7eb0c2934e58cbe
答案 0 :(得分:0)
不要使用指针指针(unsigned char **)。改为使用常规指针:
unsigned char* image = (unsigned char*)malloc(sizeof(unsigned char)*ancho*alto*4);
然后在for循环中:
for(i=0; i<ancho*alto; i++){
unsigned char* pixel = (unsigned char*)malloc(sizeof(unsigned char)*4);
fread (pixel, 4, 1, bmp_entrada);
image[i*4] = pixel[0];
image[i*4+1] = pixel[1];
image[i*4+2] = pixel[2];
image[i*4+3] = pixel[3];
free(pixel);
}