OpenCL程序分为两个部份,一部份是内核代码,负责具体算法。另一部份是主程序负责初始化OpenCL和准备数据。主程序加载内核代码,并按照即定方法进行运算。
内核代码可以写在主程序里面,也可以写在另一个文本文件里,有点像DX中的HLSL和OPENGL里的GLSL。哈哈,明白意思就行了。我们用第一种方法,把代码跟源程序分开写。
调用OpenCL大至分7个步骤
1:初始化OpenCL
2:创建上下文设备
3:创建命令队列
4:创建数据缓冲区
5:将数据上传到缓冲区
6:加载编译代码,创建内核调用函数
7:设置参数,执行内核
8:读回计算结果。
下面我们通过一个向量相加的程序来了解OpenCL 。有A,B两个四维向量,相加后值存在C向量里。OpenCL会根据用户提供的维数,将向量分解成多个任务分发给多个CPU计算。
源码分两部份
(一)vecadd.cl核心代码。
?
1
2
3
4
5
6
7
8
__kernel
void
vecAdd(__global
int
*
A,
__global
int
*
B,
__global
int
*
C)
{
int
idx = get_global_id(0);
C[idx]
= A[idx] + B[idx];
}
__kernel 指明这是一个OpenCL内核,__global 说明指针指向的是全局的设备内存空间,其它的就是C语言的函数的语法。kernel必须返回空类型。
(二)main.cpp代码
?
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include
#include
#include
#include
#include
//包含CL的头文件
using
namespace
std;
#define
elements 4
bool
GetFileData(
const
char
*
fname,string& str)
{
FILE
*
fp =
fopen
(fname,
"r"
);
if
(fp==NULL)
{
printf
(
"no
found file
"
);
return
false
;
}
int
n=0;
while
(
feof
(fp)==0)
{
str
+=
fgetc
(fp);
}
return
true
;
}
int
main()
{