非常具体的优化任务。 我有3个阵列:
我必须根据以下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指令。 UPD: 感谢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:看到它比听到它更好..