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

用于处理3字节块的OpenCL内核,opencl,Opencl,我有一个OpenCL内核,它在24位宽的块内更改位顺序 我实现这一点的第一次尝试是创建buffersize/3线程,但不知何故,我的OpenCl内核与CPU上的相同算法(2 GHz Intel Core i7)的运行速度较慢 有更好的方法吗?我不确定我是否理解您试图在算法中实现什么,但您应该使用CL向量。在以下范围内: __kernel void decode( __global uchar3* in, __global uchar3* out,

我有一个OpenCL内核,它在24位宽的块内更改位顺序

我实现这一点的第一次尝试是创建
buffersize/3
线程,但不知何故,我的OpenCl内核与CPU上的相同算法(2 GHz Intel Core i7)的运行速度较慢


有更好的方法吗?

我不确定我是否理解您试图在算法中实现什么,但您应该使用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;
}

我不确定我是否理解您试图在算法中实现什么,但您应该使用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;
}

这可能更快,因为大多数编译器不缓存全局变量:

__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;
    }
}
\u内核无效解码(
__全球uint8_*in,
__全球uint8_*out,
常量(无符号整数计数){
int i=获取全局id(0)*3;

如果(i这可能更快,因为
out
“may”指向
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;
    }
}
\u内核无效解码(
__全球uint8_*in,
__全球uint8_*out,
常量(无符号整数计数){
int i=获取全局id(0)*3;

如果(我可以使用uchar16将5倍的密度放入Intel的单次操作和SIMD中。这与操作码不完全一样。您操作的是32位元素,而他操作的是真正的24位元素。
sizeof(uchar3)=4
可以使用uchar16将5倍的密度放入Intel的单次操作和SIMD中。这与操作代码不完全一样。您操作的是32位元素,而他操作的是真正的24位元素。
sizeof(uchar3)=4