如何简化此 OpenCL 内核代码?
How can I simplify this OpenCL Kernel code?
void write_solution(uchar our_index[16], global uchar *solution) {
uchar8 solution_data = 0;
solution_data.s0 = (our_index[0] & 0xF) + ((our_index[1] & 0xF) << 4);
solution_data.s1 = (our_index[2] & 0xF) + ((our_index[3] & 0xF) << 4);
solution_data.s2 = (our_index[4] & 0xF) + ((our_index[5] & 0xF) << 4);
solution_data.s3 = (our_index[6] & 0xF) + ((our_index[7] & 0xF) << 4);
solution_data.s4 = (our_index[8] & 0xF) + ((our_index[9] & 0xF) << 4);
solution_data.s5 = (our_index[10] & 0xF) + ((our_index[11] & 0xF) << 4);
solution_data.s6 = (our_index[12] & 0xF) + ((our_index[13] & 0xF) << 4);
solution_data.s7 = (our_index[14] & 0xF) + ((our_index[15] & 0xF) << 4);
vstore8(solution_data, 0, solution);
}
从代码中可以看出,要是能这样写就好了:
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);
}
当然,OpenCL 不允许将上述代码中描述的索引符号用于矢量类型。
有什么办法可以解决这个问题吗?
向量运算是按分量进行的,您可以利用 .even 和 .odd 向量寻址模式。这对你有用吗?
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);
}
void write_solution(uchar our_index[16], global uchar *solution) {
uchar8 solution_data = 0;
solution_data.s0 = (our_index[0] & 0xF) + ((our_index[1] & 0xF) << 4);
solution_data.s1 = (our_index[2] & 0xF) + ((our_index[3] & 0xF) << 4);
solution_data.s2 = (our_index[4] & 0xF) + ((our_index[5] & 0xF) << 4);
solution_data.s3 = (our_index[6] & 0xF) + ((our_index[7] & 0xF) << 4);
solution_data.s4 = (our_index[8] & 0xF) + ((our_index[9] & 0xF) << 4);
solution_data.s5 = (our_index[10] & 0xF) + ((our_index[11] & 0xF) << 4);
solution_data.s6 = (our_index[12] & 0xF) + ((our_index[13] & 0xF) << 4);
solution_data.s7 = (our_index[14] & 0xF) + ((our_index[15] & 0xF) << 4);
vstore8(solution_data, 0, solution);
}
从代码中可以看出,要是能这样写就好了:
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);
}
当然,OpenCL 不允许将上述代码中描述的索引符号用于矢量类型。
有什么办法可以解决这个问题吗?
向量运算是按分量进行的,您可以利用 .even 和 .odd 向量寻址模式。这对你有用吗?
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);
}