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];
}

questionAnswers(2)

yourAnswerToTheQuestion