seletivamente copiar elementos de uma lista com instruções do AVX2
Desejo acelerar a operação a seguir com as instruções do AVX2, mas não consegui encontrar uma maneira de fazê-lo.
Recebo uma grande variedadeuint64_t data[100000]
de uint64_t e uma matrizunsigned char indices[100000]
de bytes. Eu quero gerar uma matrizuint64_t Out[256]
onde o i-ésimo valor é o xor de todosdata[j]
de tal modo queindex[j]=i
.
Uma implementação direta do que eu quero é esta:
uint64_t Out[256] = {0}; // initialize output array
for (i = 0; i < 100000 ; i++) {
Out[Indices[i]] ^= data[i];
}
Podemos implementar isso de maneira mais eficiente com as instruções do AVX2?
EDIT: É assim que meu código se parece agora
uint64_t Out[256][4] = {0}; // initialize output array
for (i = 0; i < 100000 ; i+=4) {
Out[Indices[i ]][0] ^= data[i];
Out[Indices[i+1]][1] ^= data[i+1];
Out[Indices[i+2]][2] ^= data[i+2];
Out[Indices[i+3]][3] ^= data[i+3];
}