我正在编写一个代码,其中包含一个具有许多迭代(~10^6-10^7)的循环,其中一个数组(比如说,'myresult')是通过对大量贡献的求和来计算的。在带有 OpenMP 的 Fortran 90 中,这将类似于:
!$omp parallel do
!$omp& reduction(+:myresult)
do i=1,N
myresult[i] = myresult[i] + [contribution]
enddo
!$omp end parallel
代码将在带有英特尔至强协处理器的系统上运行,如果可能的话,当然希望从它们的存在中受益。我曾尝试将 MIC 卸载语句 (!dir$ offload target ...) 与 OpenMP 一起使用,以便循环仅在协处理器上运行,但是当它坐在那里等待协处理器完成时,我正在浪费主机 CPU 时间。理想情况下,可以划分主机和设备之间的循环,所以我想知道以下类似的方法是否可行(或者是否有更好的方法);循环只会在主机上的一个核心上运行(尽管可能使用 OMP_NUM_THREADS=2?):
!$omp parallel sections
!$omp& reduction(+:myresult)
!$omp section ! parallel calculation on device
!dir$ offload target mic
!$omp parallel do
!$omp& reduction(+:myresult)
(do i=N/2+1,N)
!$omp end parallel do
!$omp section ! serial calculation on host
(do i=1,N/2)
!$omp end parallel sections