我试图通过在线提供的示例来学习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;
}
答案 0 :(得分:2)
是。如果“float * object”在主机(即主机内存)上,请使用clEnqueueWriteImage
。如果它在设备上(OpenCL缓冲区),请使用clEnqueueCopyBufferToImage
。