使用 Fortran 90 的 Open MP 的效率?

问题描述 投票:0回答:0

大家好,感谢那些愿意看我的问题的人。

我有一个子例程,我尝试使用 open MP 来做我想做的事,但似乎没有它我的代码更快。 问题 我有一个坐标为 (x,y) 的大点列表,我有两个参考网格 X_ref(nline,ncol) 和 Y_ref(nline,ncol)。对于列表中的每个点,我想要最近点 reagrds 到我的两个参考网格的线和冒号索引,知道一个点和我的参考网格之间的距离:dis =sqrt( (x_i - X_ref(I,J)) )² + (y_i - Y_ref(I,J)² ).

子程序在模块文件中,它可以访问 ST_OBS 和 ST_REF_GRID 结构。 使用 1 个线程 (I_NTASK=1) 需要 8.52527618E-02 秒 16 个线程 (I_NTASK=16) 需要 0.126778603 秒 对于 1 点(索引 I_T) 参考网格中没有我可以用来减少它的对称性。

为什么完成一项任务会更快?

 
子程序 COLOC_LIST_2_REFGRID_OMP(I_T,I_NTASK,I_LIN_START,I_LIN_STOP,I_COL_START,I_COL_STOP,& R_MIN_DIS,I_COL_INDEX,I_LIN_INDEX) 隐式无 逻辑 :: L_ID1、L_ID2、L_ID3、L_ID4 INTEGER :: I_T,I_NT,I_NTASK,I_thread_id,I_LIN_START,I_LIN_STOP,I_COL_START,I_COL_STOP,I_C,I_L 整数、可分配、维度(:) :: IT1_COL_MIN_INDEX、IT1_LIN_MIN_INDEX 实数,参数 :: PR_MAX_DIS=999 真实的:: R_DIS 真实的、可分配的、维度(:) :: RT1_MIN_DIS !输出 整数 :: I_COL_INDEX,I_LIN_INDEX 实数:: R_MIN_DIS !------------------------------------------------ ------------------------------------------ !使用 OMP_GET_THREAD_NUM 按处理任务存储最小索引的表 分配(IT1_COL_MIN_INDEX(0:I_NTASK-1)) 分配(IT1_LIN_MIN_INDEX(0:I_NTASK-1)) 分配(RT1_MIN_DIS(0:I_NTASK-1)) DO I_NT=0,I_NTASK-1 IT1_COL_MIN_INDEX(I_NT)=0 IT1_LIN_MIN_INDEX(I_NT)=0 RT1_MIN_DIS(I_NT)=PR_MAX_DIS ENDDO !$omp 并行 & !$omp 共享 (I_COL_START,I_COL_STOP,I_LIN_START,I_LIN_STOP) & !$omp 共享 (IT1_COL_MIN_INDEX,IT1_LIN_MIN_INDEX,RT1_MIN_DIS) & !$omp private (I_C,I_L,I_thread_id,R_DIS) !$ 做 doCOLON: DO I_C=I_COL_START,I_COL_STOP doLIN: DO I_L=I_LIN_START,I_LIN_STOP I_thread_id = OMP_GET_THREAD_NUM() R_DIS=SQRT( (ST_OBS%RT1_x(I_T)-ST_REF_GRID%RT2_x(I_C,I_L))**2 + & (ST_OBS%RT1_y(I_T)-ST_REF_GRID%RT2_y(I_C,I_L))**2 ) 如果 (R_DIS.lt.RT1_MIN_DIS(I_thread_id)) 那么 RT1_MIN_DIS(I_thread_id)=R_DIS IT1_LIN_MIN_INDEX(I_thread_id)=I_L IT1_COL_MIN_INDEX(I_thread_id)=I_C 万一 结束多林 ENDDO DOCOLON !$omp 结束做 !$omp 结束并行

!NOW WE GET THE MINIMUM AMONG ALL MINIMUM OF ALL THREADS 
R_MIN_DIS=PR_MAX_DIS
DO I_NT=0,I_NTASK-1            
IF (RT1_MIN_DIS(I_NT).lt.R_MIN_DIS) THEN
R_MIN_DIS=RT1_MIN_DIS(I_NT)
I_COL_INDEX=IT1_COL_MIN_INDEX(I_NT)
I_LIN_INDEX=IT1_LIN_MIN_INDEX(I_NT)
ENDIF
ENDDO

DEALLOCATE(IT1_COL_MIN_INDEX,IT1_LIN_MIN_INDEX,RT1_MIN_DIS)
ENDSUBROUTINE COLOC_DARDAR_MSG_GRID_OMP
performance datagrid openmp fortran90
© www.soinside.com 2019 - 2024. All rights reserved.