我有一个OpenCL内核,可以在24位宽的块内更改位顺序。
我第一次尝试实现这一点就是创建buffersize/3
个线程,但不知怎的,我的OpenCl内核在CPU(2 GHz Intel Core i7)上的运算速度相同。
typedef unsigned char uint8_t;
__kernel void decode(
__global uint8_t* in,
__global uint8_t* out,
const unsigned int count) {
int i = get_global_id(0)*3;
if(i<count){
out[i]=in[i];
out[i+1]=(in[i+1]&0b00001111)<<4|(in[i+2]&0b11110000)>>4;
out[i+2]=(in[i+2]&0b00001111)<<4|(in[i+1]&0b11110000)>>4;
}
}
这个内核以这种方式调用:
count = buffersize/3; // buffersize is approx. 6 to 8 MB
error = clEnqueueNDRangeKernel(
commands,
koDecode,
1,
NULL,
&count,
NULL,
0,
NULL,
NULL);
有更好的方法吗?
答案 0 :(得分:1)
我不确定我理解你在算法中想要实现的目标,但你应该使用CL向量。以下内容:
__kernel void decode(
__global uchar3* in,
__global uchar3* out,
const unsigned int count)
{
int i = get_global_id(0);
out[i] = out[i].zyx;
}
答案 1 :(得分:1)
这可能会更快,因为out
&#34;可能&#34;指向in
大多数编译器不会缓存全局变量:
__kernel void decode(
__global uint8_t* in,
__global uint8_t* out,
const unsigned int count) {
int i = get_global_id(0)*3;
if(i<count){
out[i]=in[i];
uint8_t t[2];
t[0] = in[i+1];
t[1] = in[i+2];
out[i+1]=(t[0]&0b00001111)<<4|(t[1]&0b11110000)>>4;
out[i+2]=(t[1]&0b00001111)<<4|(t[0]&0b11110000)>>4;
}
}
此外,如果您始终启动所需数量的工作项,那么您并不需要i<count
检查。