用于处理3字节块的OpenCL内核
我有一个OpenCL内核,它在24位宽的块内更改位顺序 我实现这一点的第一次尝试是创建用于处理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,
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