OpenCL:从float * buffer创建image2d_t

时间:2018-01-30 06:14:42

标签: opencl

我试图通过在线提供的示例来学习OpenCL。我编写了一个HelloWorld矩阵乘法程序来乘以float * A& float * B OpenCL设备矩阵。

现在我想将float * B更改为image2d_t B,并将执行速度与之前的HelloWorld代码进行比较。

是否可以在OpenCL中从float *对象创建image2d_t对象?

注意:float *数组以行主格式存储。

编辑:添加源代码:

根据@ Dithermaster的建议,我创建了一个cl图像对象并尝试从缓冲区复制到图像。

我在clEnqueueCopyBufferToImage

中遇到了细分错误
int main(void) {

  // Initialize OpenCL parameters here
  ........................
  //

  const size_t arr_width = 1024;
  const size_t arr_height = 1024;

  // Populate host array with some dummy data
  float* host_arr = (float*)malloc(sizeof(float)*arr_width*arr_height);
  for (size_t i=0; i<arr_width*arr_height; ++i) { host_arr[i] = 1.0f; }

  cl_image_format clImageFormat;
  clImageFormat.image_channel_order = CL_RGBA;
  clImageFormat.image_channel_data_type = CL_FLOAT;
  cl_int errNum;
  const size_t dst_origin[3] = {0,0,0};
  const size_t region[3] = {arr_width,arr_height,1};

  // Copy the array to the device
  cl_mem device_arr = clCreateBuffer(cl.context, CL_MEM_READ_WRITE, arr_width*arr_height*sizeof(float), NULL, NULL);
  clEnqueueWriteBuffer(cl.queue, device_c, CL_TRUE, 0, arr_width*arr_height*sizeof(float), host_c, 0, NULL, NULL);

  // Create image in device & copy array to image
  cl_mem device_img = clCreateImage2D(cl.context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, &clImageFormat, arr_width, arr_height, 0, NULL, &errNum);
  clEnqueueCopyBufferToImage(cl.queue, device_arr, device_img, 0, dst_origin, region, 0, NULL, NULL); ----> Segmentation fault

  // Clean-up
  ................................
  //
  return 0;
}

1 个答案:

答案 0 :(得分:2)

是。如果“float * object”在主机(即主机内存)上,请使用clEnqueueWriteImage。如果它在设备上(OpenCL缓冲区),请使用clEnqueueCopyBufferToImage