0

我必须优化我的 OpenCL 程序。所以我认为我将不得不使用我的 GPU(小型 4 核)提供的向量运算来完成它。

我看到对于 char / short / int / floatn 它可以处理的类型,它的首选向量宽度是 4。

我想我只需要打电话:

__kernel void mykernel(__global char4 *a,
                       __global char4 *b)

使用向量运算,但如果不是 4 的倍数,OpenCL 如何处理“a”?

谢谢

巴蒂斯特

4

1 回答 1

0

如果a不是4的倍数,你是什么意思?

在您公开a并且b是 char4 类型的情况下。这些类型中的每一个都是一个包含 4 个 char 元素的结构。类似的操作a[0].x a[0].y a[0].z a[0].w是允许的。但是你的内核中永远不会有半结构,也就是不完整的结构。

鉴于您的问题,我怀疑您会说“如果我的主机传递了一个非 4 字符数组的倍数怎么办”。问题不存在,而在于您在主机端使用的类型。因为您永远不应该在主机端使用与内核中的类型不匹配的类型。

(您使用的是 cl_char 吗?)请改用 cl_char4。

编辑:为了澄清我将举一个例子:

没有向量

核心:

__kernel foo(__global char * a, __global char * b){
     b = a;
}

主机端:

... 
clCreateBuffer(context, CL_MEM_READ_WRITE, size * cl_char, NULL, NULL);
...
... 
clEnqueueNDRangeKernel(queue, kernel, 1, NULL, size, NULL, NULL, NULL, NULL);
...

矢量图

核心:

__kernel foo(__global char4 * a, __global char4 * b){
     b = -a;
}

主机端:

... 
clCreateBuffer(context, CL_MEM_READ_WRITE, (size/4+1) * cl_char4, NULL, NULL);
...
... 
clEnqueueNDRangeKernel(queue, kernel, 1, NULL, (size/4+1), NULL, NULL, NULL, NULL);
...
于 2013-10-21T13:56:55.303 回答