2 OPENCL 概述
cl_context clCreateContest(const cl_context_properties* properties,
cl_uint num_devices,
const cl_device_id* devices,
void (CL_CALLBACK *pfn_notify)(const char* errinfo,
const void* private_info,
size_t cb,
void* user_data),
void* user_data,
cl_int* errcode_ret);
这个函数中指定了和 context 关联的一个或多个设备对象,properties 参数指定了使用的平台,如果为 NULL, 厂商选
择的缺省值被使用,这个函数也提供了一个回调机制给用户提供错误报告。现在的代码如下:
#include "stdafx.h"
#include <CL/cl.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment (lib,"OpenCL.lib")
int main(int argc, char* argv[])
{
cl_uint status;
cl_platform_id platform;
status = clGetPlatformIDs( 1, &platform, NULL );
cl_device_id device;
clGetDeviceIDs( platform, CL_DEVICE_TYPE_GPU,
1,
&device,
NULL);
cl_context context = clCreateContext( NULL,
1,
&device,
NULL, NULL, NULL);
return 0;
}
2.3.1 命令队列
接下来,我们要看下命令队列。在 OpenCL 中,命令队列就是主机的请求,在设备上执行的一种机制。
在 Kernel 执行前,我们一般要进行一些内存拷贝的工作,比如把主机内存中的数据传输到设备内存中。
另外要注意的几点就是:对于不同的设备,它们都有自己的独立的命令队列;命令队列中的命令 (kernel 函数)可能是
同步的,也可能是异步的,它们的执行顺序可以是有序的,也可以是乱序的。
cl_command_queue clCreateCommandQueue(cl_context context,
cl_device_id device,
cl_command_queue_properties properties,
cl_int* errcode_ret);
命令队列在 device 和 context 之间建立了一个连接。
命令队列 properties 指定一下内容:
• 是否乱序执行(在 AMD GPU 中,好像现在还不支持乱序执行)
• 是否启动 profiling。Profiling 通过事件机制来得到 kernel 执行时间等有用的信息,但它本身也会有一些开销。
如下图所示,命令队列把设备和 context 联系起来,尽管它们之间不是物理连接:
10