В вашем коде присутствует некоторая ложная доля, поскольку x
не гарантирует выравнивание по строке кэша.Заполнение не обязательно достаточно.В вашем примере N
действительно маленький, что может быть проблемой.Обратите внимание, что в вашем примере N
наибольшая нагрузка, вероятно, будет связана с разделением рабочих мест и управлением потоками.Если N
достаточно большой, то есть array-size / number-of-threads >> cache-line-size
, ложное совместное использование не является актуальной проблемой.
Чередование записей в A2
из разных потоков в вашем коде также не оптимально с точки зрения использования кэша, ноэто не ложная проблема совместного использования.
Обратите внимание, вам не нужно разбивать циклы.Если вы обращаетесь к индексу в памяти непрерывно в цикле, один цикл - это нормально, например,
#pragma omp for
for (int j = 0; j < N; ++j)
x[j] += 1;
Если вы действительно осторожны, вы можете добавить schedule(static)
, тогда у вас есть гарантия равномерного распределения слов.
Помните, что ложное совместное использование является проблемой производительности, а не проблемой корректности, и имеет значение только в том случае, если это происходит часто.Типичные плохие паттерны - это записи в vector[my_thread_index]
.