如何简化这个OpenCL内核代码? void write_解决方案(uchar-our_索引[16],全局uchar*解决方案){ uchar8解决方案_数据=0; 解决方案_data.s0=(我们的_索引[0]&0xF)+(我们的_索引[1]&0xF)

如何简化这个OpenCL内核代码? void write_解决方案(uchar-our_索引[16],全局uchar*解决方案){ uchar8解决方案_数据=0; 解决方案_data.s0=(我们的_索引[0]&0xF)+(我们的_索引[1]&0xF),opencl,opencl-c,Opencl,Opencl C,向量操作是组件式的,您可以利用.偶数和.奇数向量寻址模式。这对您有用吗 void write_solution(uchar our_index[16], global uchar *solution) { uchar8 solution_data = 0; for(int i = 0; i < 8; i++) { solution_data[i] = (our_index[i * 2] & 0xF) + ((our_index[i * 2 + 1]

向量操作是组件式的,您可以利用.偶数和.奇数向量寻址模式。这对您有用吗

void write_solution(uchar our_index[16], global uchar *solution) {
    uchar8 solution_data = 0;
    for(int i = 0; i < 8; i++) {
        solution_data[i] = (our_index[i * 2] & 0xF) + ((our_index[i * 2 + 1] & 0xF) << 4);
    }
    vstore8(solution_data, 0, solution);
}
void write_解决方案(uchar16我们的索引,全局uchar*解决方案){
uchar8解决方案_数据=0;

解决方案_data=(我们的_index.偶数&0xF)+(我们的_index.odd&0xF)向量操作是组件式的,您可以利用.偶数和.odd向量寻址模式。这对您有用吗

void write_solution(uchar our_index[16], global uchar *solution) {
    uchar8 solution_data = 0;
    for(int i = 0; i < 8; i++) {
        solution_data[i] = (our_index[i * 2] & 0xF) + ((our_index[i * 2 + 1] & 0xF) << 4);
    }
    vstore8(solution_data, 0, solution);
}
void write_解决方案(uchar16我们的索引,全局uchar*解决方案){
uchar8解决方案_数据=0;

解决方案数据=(我们的索引为偶数和0xF)+(我们的索引为奇数和0xF)有没有办法将
我们的索引
作为
uchar16
而不是数组传递?如果有,可以使用
.偶数
奇数
后缀非常简洁地编写。@jprice我正在研究它。我认为这是可能的,但这不是一个微不足道的变化。你也可以使用
uchar[8]
数组,用于
解决方案\u数据
而不是向量,然后使用循环将其写入
解决方案
,并希望编译器将展开循环并执行与
vstore8
相同的优化。是否有任何方法可以将
我们的\u索引
作为
uchar16
而不是ar传递ray?如果是这样的话,可以使用
.偶数
奇数
后缀非常简洁地编写。@jprice我正在研究它。我认为这是可能的,但这不是一个微不足道的变化。你也可以使用
uchar[8]
数组,用于
解决方案\u数据
而不是向量,然后使用循环将其写入
解决方案
,并希望编译器将展开循环并执行与
vstore8
相同的优化。难道
我们的\u索引
不需要转换为
uchar16
才能工作吗?啊,好d点。我错过了。可能值得尝试转换或传入uchar16。向量操作利用了大多数现代硬件所具有的SIMD单元。(事实上,我认为SIMD是符合opencl的设备的一个要求)
我们的_索引
是否需要转换为
uchar16
才能工作?啊,好的观点。我错过了。可能值得尝试转换或传入uchar16。向量运算利用了大多数现代硬件所具有的SIMD单元。(事实上,我认为SIMD是符合opencl的设备的要求)
void write_solution(uchar16 our_index, global uchar *solution) {
    uchar8 solution_data = 0;
    solution_data = (our_index.even & 0xF) + ((our_index.odd & 0xF) << 4);
    vstore8(solution_data, 0, solution);
}