Мне известно об этом и это, но я спрашиваю еще раз, так как первая ссылка уже довольно старая, а вторая ссылка, похоже, не привела к окончательному ответу. Сформировался ли какой-либо консенсус?
Моя проблема проста:
У меня есть цикл DO
с элементами, которые могут выполняться одновременно. Какой метод я использую?
Ниже приведен код для создания частиц на простой кубической решетке.
- npart — количество частиц
- npart_edge и npart_face — вдоль ребра и грани соответственно.
- space – шаг решетки
- Rx, Ry, Rz — массивы позиций
- x, y, z — временные переменные для определения положения на решетке.
Обратите внимание на разницу в том, что x,y и z должны быть массивами в случае CONCURRENT, но не в случае OpenMP, потому что они могут быть определены как PRIVATE.
Итак, я использую DO CONCURRENT
(который, как я понял из приведенных выше ссылок, использует SIMD):
DO CONCURRENT (i = 1, npart)
x(i) = MODULO(i-1, npart_edge)
Rx(i) = space*x(i)
y(i) = MODULO( ( (i-1) / npart_edge ), npart_edge)
Ry(i) = space*y(i)
z(i) = (i-1) / npart_face
Rz(i) = space*z(i)
END DO
Или я использую OpenMP?
!$OMP PARALLEL DEFAULT(SHARED) PRIVATE(x,y,z)
!$OMP DO
DO i = 1, npart
x = MODULO(i-1, npart_edge)
Rx(i) = space*x
y = MODULO( ( (i-1) / npart_edge ), npart_edge)
Ry(i) = space*y
z = (i-1) / npart_face
Rz(i) = space*z
END DO
!$OMP END DO
!$OMP END PARALLEL
Мои тесты:
Размещение 64 частиц в коробке со стороной 10:
$ ifort -qopenmp -real-size 64 omp.f90
$ ./a.out
CPU time = 6.870000000000001E-003
Real time = 3.600000000000000E-003
$ ifort -real-size 64 concurrent.f90
$ ./a.out
CPU time = 6.699999999999979E-005
Real time = 0.000000000000000E+000
Размещение 100000 частиц в коробке со стороной 100:
$ ifort -qopenmp -real-size 64 omp.f90
$ ./a.out
CPU time = 8.213300000000000E-002
Real time = 1.280000000000000E-002
$ ifort -real-size 64 concurrent.f90
$ ./a.out
CPU time = 2.385000000000000E-003
Real time = 2.400000000000000E-003
Использование конструкции DO CONCURRENT
, по-видимому, дает мне как минимум на порядок лучшую производительность. Это было сделано на i7-4790K. Кроме того, преимущество параллелизма, по-видимому, уменьшается с увеличением размера.
do concurrent
. - person francescalus   schedule 24.07.2016