Maneira fácil de armazenar em cache para coletar resultados de vários threads

ConsiderarN threads fazendo algumas tarefas assíncronas com pequeno valor de resultado comodouble ouint64_t. Então sobre8 valores de resultado podem caber em uma única linha de cache da CPU.N é igual ao número de núcleos da CPU.

Por um lado, se eu apenas alocar uma matriz deN itens, cada umdouble ouint64_t, então8 threads compartilharão uma linha de cache da CPU, o que parece ineficiente.

Por outro lado, se eu alocar uma linha de cache inteira para cadadouble/int64_t, o encadeamento do receptor precisará buscarN linhas de cache, cada uma escrita por um núcleo de CPU diferente (exceto 1).

Então, existe uma solução eficiente para esse cenário? A CPU é x86-64. Uma solução em C ++ é preferida.

Esclarecimento 1: sobrecarga de lançamento / saída de encadeamento não é grande porque o conjunto de encadeamentos é usado. Portanto, é principalmente a sincronização em uma seção crítica.

Esclarecimento 2: Os lotes paralelos carregam uma dependência. O encadeamento mestre só pode iniciar o próximo lote de cálculos paralelos depois de coletar e processar os resultados do lote anterior. Como os resultados do lote anterior servem como alguns parâmetros do próximo lote.

questionAnswers(2)

yourAnswerToTheQuestion