Não sei como explicar alguns dos resultados de desempenho do meu código de multiplicação de matrizes paralelizadas

Estou executando esse código no OpenMP para multiplicação de matrizes e medi seus resultados:

#pragma omp for schedule(static)
for (int j = 0; j < COLUMNS; j++)
    for (int k = 0; k < COLUMNS; k++)
        for (int i = 0; i < ROWS; i++)
            matrix_r[i][j] += matrix_a[i][k] * matrix_b[k][j];

Existem diferentes versões do código com base em onde eu coloquei o#pragma omp&nbsp;diretiva - antes do loop j, do loop k ou do loop i. Além disso, para cada uma dessas variantes, executei versões diferentes para agendamento estático padrão, agendamento estático com os fragmentos 1 e 10 e agendamento dinâmico com os mesmos fragmentos. Também medi o número de acessos ao controlador de domínio, erros de controlador de domínio, relógios da CPU, instruções desativadas e outros indicadores de desempenho no CodeXL. Aqui estão os resultados para a matriz de tamanho 1000x1000 no AMD Phenom I X4 945:

Resultados das medições de desempenho

Ondemultiply_matrices_1_dynamic_1&nbsp;é uma função com#pragma omp&nbsp;antes do primeiro loop e agendamento dinâmico com o chunk 1, etc. Aqui estão algumas coisas que eu não entendo muito sobre os resultados e gostaria de receber ajuda:

A versão estática padrão com paralelização antes do loop interno é executada em 2.512s, enquanto a versão sequencial é executada em 31.683s - apesar do fato de ter sido executada em uma máquina de quatro núcleos, imaginei que a maior aceleração possível seria 4x. É logicamente possível que isso ocorra ou isso é algum erro? Como posso explicar isso?O CodeXL diz que a 3ª versão com agendamento estático tem um número muito menor de acessos ao controlador de domínio (e perde) do que as outras versões. Por que é que? Não é em grande parte porque todos os threads paralelos operam na mesma célula da matriz b. É isso?Eu sei que a segunda versão é incorreta devido ao fato de que os threads podem operar na mesma célula da matriz R, o que pode causar condições de corrida. Por que ele tem um desempenho mais baixo? O erro causa de alguma forma?Percebo que o agendamento dinâmico causa uma sobrecarga, e é por isso que o código fica mais lento ao usá-lo. Além disso, com a 3ª versão (com pragma antes do loop i), o agendamento é realizado muito mais vezes (bilhões de vezes com uma matriz 1000x1000), de modo que o algoritmo tem muito menos desempenho. No entanto, esse agendamento não parece causar lentidão na 2ª versão (com pragma antes do 2º loop). Por que é que?

Além disso, estou confuso sobre a relação entre TLB e cache. Quando o DTLB é usado especificamente? O documento do meu professor diz que todo acesso ao controlador de domínio é uma solicitação DTLB, mas eu não entendo como isso funciona - o número de falhas no TLB é geralmente maior que o número de acessos ao controlador de domínio. Como computo a taxa de perda de TLB? Meu professor diz que é falta de TBL / acesso à CD. Ele também diz que eu posso calcular a localidade temporal pela taxa de acertos do cache e a localidade espacial pela taxa de acertos do TLB. Como isso funciona exatamente?