Я бег следующего кода для матричного умножения производительности которого я должен измерить:Могут ли условия гонки снизить производительность кода?
for (int j = 0; j < COLUMNS; j++)
#pragma omp for schedule(dynamic, 10)
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];
Да, я знаю, что это очень медленно, но это не главное - это исключительно для целей измерения производительности , Я запускаю 3 версии кода в зависимости от того, где я помещаю директиву #pragma omp
, и, следовательно, в зависимости от того, где происходит распараллеливание. Код запускается в Microsoft Visual Studio 2012 в режиме выпуска и профилируется в CodeXL.
Одна вещь, которую я заметил из измерений, заключается в том, что опция в фрагменте кода (с распараллеливанием перед циклом k) является самой медленной, а затем версией с директивой перед j-циклом, а затем с ней перед цикл i. Представленная версия также является той, которая вычисляет неверный результат из-за условий гонки - одновременное использование нескольких потоков одним и тем же элементом матрицы результатов. Я понимаю, почему версия i цикла является самой быстрой - все конкретные потоки обрабатывают только часть диапазона i-переменной, увеличивая временную локальность. Тем не менее, я не понимаю, что приводит к тому, что версия цикла k является самой медленной - связано ли это с тем, что она производит неверный результат?
Почему бы» вы меняете внутренний и внешний петли, как [я объяснил вчера] (http://stackoverflow.com/a/34873966/2542702). Это тривиально реализовать. –