如何优化双重解除引用?

时间:2018-01-21 23:33:14

标签: algorithm assembly optimization sse avx

非常具体的优化任务。 我有3个阵列:

  • const char * inputTape
  • const int * inputOffset,以四个一组的方式组织
  • char * outputTapeoutput

我必须根据以下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:看到它比听到它更好.. enter image description here

0 个答案:

没有答案