下载配置所需的所有文件(内含Intel OpenCL的SDK(Win7及Win8.1))
点击获取 访问密码e085
(因网盘失效及版本过久,建议自行前往官网下载);解压intel_sdk_for_ocl_applications_2013.64050.zip到本地,双击setup.exe开始安装(安装后可将整个文件夹删除),记住安装路径(可以自定义安装)。win8.1直接双击intel_sdk_for_ocl_applications_2014_x64_setup.msi进行安装;
- 打开VS2012->文件->Visual C++->Win32->Win32 控制台应用程序->输入工程名,选择工程存放路径->确定->下一步->完成,这样就成功新建一个VS控制台程序工程;
- 按照以下步骤配置工程,搭建OpenCL开发环境(主要是导入库文件和链入动态库);
- 项目名->右键属性进入设置窗口。
- C/C++ -> 常规 -> 选中附加包含目录 -> 点击右测下拉框 编辑 -> 通过(插入新行->选择文件夹)把安装目录下与bin同级目录的include文件夹的路径添加进去。
- 类似的,链接器->常规->附加库目录,把lib/x86目录也加进去(64位系统也选择x86文件夹)。链接器->输入->附加依赖项,输入OpenCL.lib(存放在lib/x86目录下)。
- 最后,就可以:应用->确定保存设置;
此处还需要注意的是后面helloWorld程序调用到fopen函数,但编译时会产生vs2012 error c4996: This functionor variable may be unsafe
对于这个错误,需要按照上述方式在C/C++ -> 预处理器->预处理器定义中加入_CRT_SECURE_NO_WARNINGS
(其他选项之后处加入)。 拷贝以下内容,覆盖整个工程.cpp文件,保存后CTRL+F5编译运行,便可以查看到电脑中支持OpenCL的硬件nvidia或intel或AMD等信息。如果发生错误,请按照上述步骤检查,重新进行配置;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127//
// 本程序是读取电脑中的支持OpenCL的硬件nvidia或intel或AMD等信息,然后显示在屏幕上
using namespace std;
//根据参数,判断设备类别。是CPU、GPU、ACCELERATOR或其他设备
const char* GetDeviceType(cl_device_type it)
{
if (it == CL_DEVICE_TYPE_CPU)
return "CPU";
else if (it == CL_DEVICE_TYPE_GPU)
return "GPU";
else if (it == CL_DEVICE_TYPE_ACCELERATOR)
return "ACCELERATOR";
else
return "DEFAULT";
}
int main()
{
char dname[512];
cl_device_id devices[20];
cl_platform_id* platform_id = NULL;
cl_uint num_devices;
cl_device_type int_type;
cl_ulong long_entries;
cl_uint num_platform;
cl_int err;
//查询系统上可用的计算平台,可以理解为初始化
err = clGetPlatformIDs(0, NULL, &num_platform);
if (err != CL_SUCCESS)
{
cout << "clGetPlatformIDs error" << endl;
return 0;
}
cout << "PlatForm num:" << num_platform << endl;
unsigned int st = 0;
platform_id = new cl_platform_id[num_platform];
err = clGetPlatformIDs(num_platform, platform_id, NULL);
if (err != CL_SUCCESS)
{
cout << "clGetPlatformIDs error" << endl;
return 0;
}
// 检查系统上可用平台
for (st = 0; st<num_platform; st++)
{
cout << endl << "----------------------------------" << endl;
cout << "Platform " << st + 1 << endl;
//获取可用计算平台的名称
clGetPlatformInfo(platform_id[st], CL_PLATFORM_NAME, 512, dname, NULL);
cout << "CL_PLATFORM_NAME:" << dname << endl;
//获取可用计算平台的版本号,即OpenCL的版本号
clGetPlatformInfo(platform_id[st], CL_PLATFORM_VENDOR, 512, dname, NULL);
cout << "CL_PLATFORM_VERSION:" << dname << endl;
//获取可用计算平台的设备数目
clGetDeviceIDs(platform_id[st], CL_DEVICE_TYPE_ALL, 20, devices, &num_devices);
cout << "Device num:" << num_devices << endl << endl;
unsigned int n = 0;
//检测当前平台下所有设备的属性
for (n = 0; n<num_devices; ++n)
{
cout << endl << "Device " << n + 1 << endl;
//获取设备名称
clGetDeviceInfo(devices[n], CL_DEVICE_NAME, 512, dname, NULL);
cout << "Device :" << dname << endl;
//获取设备类别
clGetDeviceInfo(devices[n], CL_DEVICE_TYPE, sizeof(cl_device_type), &int_type, NULL);
cout << "Device Type:" << GetDeviceType(int_type) << endl;
//获取设备版本号
clGetDeviceInfo(devices[n], CL_DRIVER_VERSION, 512, dname, NULL);
cout << "Device version:" << dname << endl;
//获取设备全局内存大小
clGetDeviceInfo(devices[n], CL_DEVICE_GLOBAL_MEM_SIZE, sizeof(cl_ulong), &long_entries, NULL);
cout << "Device global mem(MB):" << long_entries / 1024 / 1024 << endl;
//获取设备CACHE内存大小
clGetDeviceInfo(devices[n], CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, sizeof(cl_ulong), &long_entries, NULL);
cout << "Device global mem cache(KB):" << long_entries / 1024 << endl;
//获取本地内存大小
clGetDeviceInfo(devices[n], CL_DEVICE_LOCAL_MEM_SIZE, sizeof(cl_ulong), &long_entries, NULL);
cout << "Device Locale mem(KB) :" << long_entries / 1024 << endl;
//获取设备频率
clGetDeviceInfo(devices[n], CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof(cl_ulong), &long_entries, NULL);
cout << "Device Max clock(MHz) :" << long_entries << endl;
//获取最大工作组数
clGetDeviceInfo(devices[n], CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof(cl_ulong), &long_entries, NULL);
cout << "Device Max Group size :" << long_entries << endl;
//获取最大计算核心数
clGetDeviceInfo(devices[n], CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(cl_ulong), &long_entries, NULL);
cout << "Device Max parallel cores:" << long_entries << endl;
// 获取扩展信息
cl_uint addr_data;
clGetDeviceInfo(devices[n], CL_DEVICE_ADDRESS_BITS, sizeof(addr_data), &addr_data, NULL);
char ext_data[4096];
clGetDeviceInfo(devices[n], CL_DEVICE_EXTENSIONS, sizeof(ext_data), ext_data, NULL);
printf("ADDRESS_WIDTH: %u\nEXTENSIONS: %s\n\n", addr_data, ext_data);
}
}
return 0;
}以后新建OpenCL工程时,需要遵照步骤4进行设置;
- 新建工程,工程名为helloWorld ,并进行相应配置。拷贝以下内容,覆盖整个helloWorld.cpp文件,新建main.cl文件到工程目录下的/helloWorld下,内容如下,保存后CTRL+F5编译运行,即可看到Hello World!字样。
1 |
|
1 | // kernel function |
注意:
- win8.1 下 VS2013 搭建 OpenCL 开发环境只需改变安装的 SDK 即可;
- 此外还需要注意的是,由于该SDK使用的是OpenCL 2.0规范,某些函数在cl.h里被声明为弃用,需要在
#include <CL/cl.h>
包含头文件之后添加#pragma warning( disable : 4996)启用这些函数,这样才能继续使用OpenCL 1.2的函数)