openCL 优化

openCL 优化
1 LocalMemory 避免 bank conflict
每个SIMD 引擎32KB 的 LDS 被分为 32 个 Bank 每个 Bank 的带宽是4byte的数组 数组中位置为N的元素位于 Bank (N%32) 中 一个时钟周期内 每个 Bank 独立工作 如果多个线程访问同一个 Bank 内的不同地址 时操作不能并行 访问同一个地址 不会造成 Bank conflict
为避免 冲突发生
1 均匀访问
2 在原有放在 local 的结构加入占位元素
比如 float2 访问 0 2 4 8 。。。。会在下面操作中访问到同一个bank内的不同地址
加入占位元素以后 0 3 5 9 。。。。会在下面错开同一个bank
2 使用vloadn vstoren加快读取写入速度
1
/* [Vector Implementation] */
18 __kernel void hello_world_vector(__global int* restrict inputA,
19 __global int* restrict inputB,
20 __global int* restrict output)
21 {
22 /*
23 * We have reduced the global work size (n) by a factor of 4 compared to the hello_world_opencl sample.
24 * Therefore, i will now be in the range [0, (n / 4) - 1].
25 */
26 int i = get_global_id(0);
27
28 /*
29 * Load 4 integers into ‘a’.
30 * The offset calculation is implicit from the size of the vector load.
31 * For vloadN(i, p), the address of the first data loaded would be p + i * N.
32 * Load from the data from the address: inputA + i * 4.
33 */
34 int4 a = vload4(i, inputA);
35 /* Do the same for inputB */
36 int4 b = vload4(i, inputB);
37
38 /*
39 * Do the vector addition.
40 * Store the result at the address: output + i * 4.
41 */
42 vstore4(a + b, i, output);
43 }
44 /* [Vector Implementation] */

你可能感兴趣的:(OpenCL)