非常具体的优化任务。
我有3个数组:
- const char* 输入磁带
- const int* inputOffset,以四个为一组
- char* 输出磁带输出
我必须根据以下 5 个操作从输入组装输出磁带:
int selectorOffset = inputOffset[4*i];
char selectorValue = inputTape[selectorOffset];
int outputOffset = inputOffset[4*i+1+selectorValue];
char outputValue = inputTape[outputOffset];
outputTape[i] = outputValue; // store byte
然后前进柜台。
所有迭代都是相同的并且可以并行完成。 inputOffset 的格式可能会发生变化,但直到相同的输入将产生相同的输出。
GPU 上的 OpenCL 在该算法上失败(与 cpu 的工作方式相同甚至更慢)
组装最好的我得到了 5 mov、1 lea、1 dec 指令。更新:
感谢 Peter Cordes 的一点提示
loop_start:
mov eax,dword ptr [rdx-10h] ; selector offset
movzx r10d,byte ptr [rax+r8] ; selector value
mov eax,dword ptr [rdx+r10*4-0Ch] ; output offset
movzx r10d,byte ptr [r8+rax] ; output value
mov byte ptr [r9+rcx-1],r10b ; store to outputTape
lea rdx, [rdx-10h] ; pointer to inputOffset for current
dec ecx ; loop counter, sets zero flag if (ecx == 0)
jne loop_start ; continue looping while non zero iterations left: ( ecx != 0 )
我如何针对 SSE/AVX 操作进行优化?我迷惑了...
UPD: better to see it than to hear it..