OpenCL内核用于处理3个字节块

时间:2016-04-30 15:50:34

标签: opencl

我有一个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);

有更好的方法吗?

2 个答案:

答案 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检查。