У меня есть следующая программа.nv - около 100, dgemm - 20x100 или около того, поэтому есть много работы:
#pragma omp parallel for schedule(dynamic,1)
for (int c = 0; c < int(nv); ++c) {
omp::thread thread;
matrix &t3_c = vv_.at(omp::num_threads()+thread);
if (terms.first) {
blas::gemm(1, t2_, vvvo_, 1, t3_c);
blas::gemm(1, vvvo_, t2_, 1, t3_c);
}
matrix &t3_b = vv_[thread];
if (terms.second) {
matrix &t2_ci = vo_[thread];
blas::gemm(-1, t2_ci, Vjk_, 1, t3_c);
blas::gemm(-1, t2_ci, Vkj_, 0, t3_b);
}
}
, однако с GCC 4.4, GOMP v1, gomp_barrier_wait_end
составляет почти 50% времени выполнения.Изменение GOMP_SPINCOUNT
уменьшает накладные расходы, но тогда используются только 60% ядер.То же самое для OMP_WAIT_POLICY=passive
.Система Linux, 8 ядер.
Как я могу получить полное использование без вращения / ожидания перегрузки