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.