Не уверен, как объяснить некоторые из результатов производительности моего кода распараллеленного матричного умножения
Я запускаю этот код в OpenMP для умножения матриц и измерил его результаты:
#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];
Существуют разные версии кода, основанные на том, куда я положил#pragma omp
директива - перед циклом j, циклом k или циклом i. Кроме того, для каждого из этих вариантов я запускал разные версии для статического планирования по умолчанию, статического планирования с блоками 1 и 10 и динамического планирования с теми же блоками. Я также измерил количество обращений к DC, пропусков DC, тактовых импульсов процессора, удаленных команд и других показателей производительности в CodeXL. Вот результаты для матрицы размером 1000x1000 на AMD Phenom I X4 945:
Результаты измерений производительности
кудаmultiply_matrices_1_dynamic_1
это функция с#pragma omp
перед первым циклом и динамическим планированием с чанком 1 и т. д. Вот некоторые вещи, которые я не совсем понимаю о результатах и буду признателен за помощь:
Кроме того, меня смущает связь пропусков TLB с пропусками в кеше. Когда DTLB используется специально? В документе моего профессора говорится, что каждый доступ к DC является запросом DTLB, но я не понимаю, как это работает - число пропусков TLB часто превышает количество обращений к DC. Как рассчитать коэффициент пропусков TLB? Мой профессор говорит, что это TBL пропуски / доступы DC. Он также говорит, что я могу вычислить временную локальность по коэффициенту попадания в кэш, а пространственную локальность - по коэффициенту попадания в TLB. Как это работает точно?