Changeset 327 for codes/icosagcm/trunk/src/transfert_mpi.f90
- Timestamp:
- 02/09/15 20:18:34 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/transfert_mpi.f90
r295 r327 159 159 DO j=jj_begin,jj_end 160 160 CALL request_add_point(ind,ii_end+1,j,req_e1_scal,left) 161 ENDDO 162 DO j=jj_begin,jj_end 161 163 CALL request_add_point(ind,ii_end+1,j-1,req_e1_scal,lup) 162 164 ENDDO … … 169 171 DO j=jj_begin,jj_end 170 172 CALL request_add_point(ind,ii_begin-1,j,req_e1_scal,right) 173 ENDDO 174 DO j=jj_begin,jj_end 171 175 CALL request_add_point(ind,ii_begin-1,j+1,req_e1_scal,rdown) 172 176 ENDDO … … 213 217 DO j=jj_begin,jj_end 214 218 CALL request_add_point(ind,ii_end+1,j,req_e1_vect,left) 219 ENDDO 220 DO j=jj_begin,jj_end 215 221 CALL request_add_point(ind,ii_end+1,j-1,req_e1_vect,lup) 216 222 ENDDO … … 223 229 DO j=jj_begin,jj_end 224 230 CALL request_add_point(ind,ii_begin-1,j,req_e1_vect,right) 231 ENDDO 232 DO j=jj_begin,jj_end 225 233 CALL request_add_point(ind,ii_begin-1,j+1,req_e1_vect,rdown) 226 234 ENDDO … … 1096 1104 INTEGER,POINTER :: sign(:) 1097 1105 INTEGER :: offset,msize,rank 1098 1099 CALL trace_start("transfert_mpi") 1106 INTEGER :: lbegin, lend 1107 1108 ! CALL trace_start("send_message_mpi") 1100 1109 1101 1110 !$OMP BARRIER … … 1192 1201 1193 1202 DO ind=1,ndomain 1194 IF (.NOT. assigned_domain(ind) .OR. .NOT. is_omp_level_master) CYCLE1203 IF (.NOT. assigned_domain(ind) ) CYCLE 1195 1204 1196 1205 dim3=size(field(ind)%rval3d,2) 1206 CALL distrib_level(dim3,lbegin,lend) 1207 1197 1208 rval3d=>field(ind)%rval3d 1198 1209 req=>message%request(ind) … … 1205 1216 ireq=send%ireq 1206 1217 buffer_r=>message%buffers(ireq)%r 1207 offset=send%offset*dim3 1208 1209 DO d3=1,dim3 1218 1219 offset=send%offset*dim3 + (lbegin-1)*send%size 1220 1221 CALL trace_start("copy_to_buffer") 1222 1223 DO d3=lbegin,lend 1210 1224 DO n=1,send%size 1211 1225 buffer_r(n+offset)=rval3d(value(n),d3) … … 1213 1227 offset=offset+send%size 1214 1228 ENDDO 1215 1216 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1217 !$OMP CRITICAL 1218 CALL MPI_ISEND(buffer_r,send%size*dim3,MPI_REAL8,send%rank,send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1219 !$OMP END CRITICAL 1220 ELSE IF (mpi_threading_mode==MPI_THREAD_MULTIPLE) THEN 1221 CALL MPI_ISEND(buffer_r,send%size*dim3,MPI_REAL8,send%rank,send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1229 CALL trace_end("copy_to_buffer") 1230 1231 IF (is_omp_level_master) THEN 1232 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1233 !$OMP CRITICAL 1234 CALL MPI_ISEND(buffer_r,send%size*dim3,MPI_REAL8,send%rank,send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1235 !$OMP END CRITICAL 1236 ELSE IF (mpi_threading_mode==MPI_THREAD_MULTIPLE) THEN 1237 CALL MPI_ISEND(buffer_r,send%size*dim3,MPI_REAL8,send%rank,send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1238 ENDIF 1222 1239 ENDIF 1223 1240 ENDIF … … 1226 1243 1227 1244 DO ind=1,ndomain 1228 IF (.NOT. assigned_domain(ind) .OR. .NOT. is_omp_level_master) CYCLE1245 IF (.NOT. assigned_domain(ind) ) CYCLE 1229 1246 dim3=size(field(ind)%rval3d,2) 1247 CALL distrib_level(dim3,lbegin,lend) 1230 1248 rval3d=>field(ind)%rval3d 1231 1249 req=>message%request(ind) … … 1240 1258 sgn=>recv%sign 1241 1259 1242 DO n=1,recv%size 1243 rval3d(value(n),:)=src_rval3d(src_value(n),:)*sgn(n) 1260 CALL trace_start("copy_data") 1261 1262 DO d3=lbegin,lend 1263 DO n=1,recv%size 1264 rval3d(value(n),d3)=src_rval3d(src_value(n),d3)*sgn(n) 1265 ENDDO 1244 1266 ENDDO 1267 CALL trace_end("copy_data") 1245 1268 1246 1269 ELSE … … 1248 1271 buffer_r=>message%buffers(ireq)%r 1249 1272 1250 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1251 !$OMP CRITICAL 1252 CALL MPI_IRECV(buffer_r,recv%size*dim3,MPI_REAL8,recv%rank,recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1253 !$OMP END CRITICAL 1254 ELSE IF (mpi_threading_mode==MPI_THREAD_MULTIPLE) THEN 1255 CALL MPI_IRECV(buffer_r,recv%size*dim3,MPI_REAL8,recv%rank,recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1273 IF (is_omp_level_master) THEN 1274 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1275 !$OMP CRITICAL 1276 CALL MPI_IRECV(buffer_r,recv%size*dim3,MPI_REAL8,recv%rank,recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1277 !$OMP END CRITICAL 1278 ELSE IF (mpi_threading_mode==MPI_THREAD_MULTIPLE) THEN 1279 CALL MPI_IRECV(buffer_r,recv%size*dim3,MPI_REAL8,recv%rank,recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1280 ENDIF 1256 1281 ENDIF 1257 ENDIF 1282 ENDIF 1258 1283 ENDDO 1259 1284 … … 1263 1288 1264 1289 DO ind=1,ndomain 1265 IF (.NOT. assigned_domain(ind) .OR. .NOT. is_omp_level_master) CYCLE1290 IF (.NOT. assigned_domain(ind) ) CYCLE 1266 1291 1267 1292 dim3=size(field(ind)%rval4d,2) 1293 CALL distrib_level(dim3,lbegin,lend) 1268 1294 dim4=size(field(ind)%rval4d,3) 1269 1295 rval4d=>field(ind)%rval4d … … 1278 1304 ireq=send%ireq 1279 1305 buffer_r=>message%buffers(ireq)%r 1280 offset=send%offset*dim3*dim4 1281 1306 1307 CALL trace_start("copy_to_buffer") 1282 1308 DO d4=1,dim4 1283 DO d3=1,dim3 1309 offset=send%offset*dim3*dim4 + dim3*send%size*(d4-1) + (lbegin-1)*send%size 1310 1311 DO d3=lbegin,lend 1284 1312 DO n=1,send%size 1285 1313 buffer_r(n+offset)=rval4d(value(n),d3,d4) … … 1288 1316 ENDDO 1289 1317 ENDDO 1290 1291 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1292 !$OMP CRITICAL 1293 CALL MPI_ISEND(buffer_r,send%size*dim3*dim4,MPI_REAL8,send%rank,send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1294 !$OMP END CRITICAL 1295 ELSE IF (mpi_threading_mode==MPI_THREAD_MULTIPLE) THEN 1296 CALL MPI_ISEND(buffer_r,send%size*dim3*dim4,MPI_REAL8,send%rank,send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1318 CALL trace_end("copy_to_buffer") 1319 1320 IF (is_omp_level_master) THEN 1321 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1322 !$OMP CRITICAL 1323 CALL MPI_ISEND(buffer_r,send%size*dim3*dim4,MPI_REAL8,send%rank,send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1324 !$OMP END CRITICAL 1325 ELSE IF (mpi_threading_mode==MPI_THREAD_MULTIPLE) THEN 1326 CALL MPI_ISEND(buffer_r,send%size*dim3*dim4,MPI_REAL8,send%rank,send%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1327 ENDIF 1297 1328 ENDIF 1298 1329 … … 1302 1333 1303 1334 DO ind=1,ndomain 1304 IF (.NOT. assigned_domain(ind) .OR. .NOT. is_omp_level_master) CYCLE1335 IF (.NOT. assigned_domain(ind) ) CYCLE 1305 1336 1306 1337 dim3=size(field(ind)%rval4d,2) 1338 CALL distrib_level(dim3,lbegin,lend) 1307 1339 dim4=size(field(ind)%rval4d,3) 1308 1340 rval4d=>field(ind)%rval4d … … 1317 1349 sgn=>recv%sign 1318 1350 1319 DO n=1,recv%size 1320 rval4d(value(n),:,:)=src_rval4d(src_value(n),:,:)*sgn(n) 1351 CALL trace_start("copy_data") 1352 DO d4=1,dim4 1353 DO d3=lbegin,lend 1354 DO n=1,recv%size 1355 rval4d(value(n),d3,d4)=src_rval4d(src_value(n),d3,d4)*sgn(n) 1356 ENDDO 1357 ENDDO 1321 1358 ENDDO 1359 1360 CALL trace_end("copy_data") 1322 1361 1323 1362 ELSE … … 1325 1364 ireq=recv%ireq 1326 1365 buffer_r=>message%buffers(ireq)%r 1327 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1328 !$OMP CRITICAL 1329 CALL MPI_IRECV(buffer_r,recv%size*dim3*dim4,MPI_REAL8,recv%rank,recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1330 !$OMP END CRITICAL 1331 ELSE IF (mpi_threading_mode==MPI_THREAD_MULTIPLE) THEN 1332 CALL MPI_IRECV(buffer_r,recv%size*dim3*dim4,MPI_REAL8,recv%rank,recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1366 IF (is_omp_level_master) THEN 1367 IF (mpi_threading_mode==MPI_THREAD_SERIALIZED) THEN 1368 !$OMP CRITICAL 1369 CALL MPI_IRECV(buffer_r,recv%size*dim3*dim4,MPI_REAL8,recv%rank,recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1370 !$OMP END CRITICAL 1371 ELSE IF (mpi_threading_mode==MPI_THREAD_MULTIPLE) THEN 1372 CALL MPI_IRECV(buffer_r,recv%size*dim3*dim4,MPI_REAL8,recv%rank,recv%tag+1000*message%number,comm_icosa, message%mpi_req(ireq),ierr) 1373 ENDIF 1333 1374 ENDIF 1334 1335 1375 ENDIF 1336 1376 ENDDO … … 1362 1402 1363 1403 !$OMP BARRIER 1364 CALL trace_end("transfert_mpi")1404 ! CALL trace_end("send_message_mpi") 1365 1405 1366 1406 END SUBROUTINE send_message_mpi … … 1402 1442 INTEGER :: ireq,nreq 1403 1443 INTEGER :: ind,n,l,m,i 1404 INTEGER :: dim3,dim4,d3,d4 1444 INTEGER :: dim3,dim4,d3,d4,lbegin,lend 1405 1445 INTEGER :: offset 1406 1446 1407 1447 IF (.NOT. message%pending) RETURN 1408 1448 1409 CALL trace_start("transfert_mpi")1449 ! CALL trace_start("wait_message_mpi") 1410 1450 1411 1451 field=>message%field … … 1452 1492 1453 1493 DO ind=1,ndomain 1454 IF (.NOT. assigned_domain(ind) .OR. .NOT. is_omp_level_master) CYCLE1494 IF (.NOT. assigned_domain(ind) ) CYCLE 1455 1495 1456 1496 rval3d=>field(ind)%rval3d … … 1465 1505 1466 1506 dim3=size(rval3d,2) 1467 offset=recv%offset*dim3 1468 DO d3=1,dim3 1469 DO n=1,recv%size 1470 rval3d(value(n),d3)=buffer_r(n+offset)*sgn(n) 1507 1508 CALL distrib_level(dim3,lbegin,lend) 1509 offset=recv%offset*dim3 + (lbegin-1)*recv%size 1510 CALL trace_start("copy_from_buffer") 1511 1512 IF (req%vector) THEN 1513 DO d3=lbegin,lend 1514 DO n=1,recv%size 1515 rval3d(value(n),d3)=buffer_r(n+offset)*sgn(n) 1516 ENDDO 1517 offset=offset+recv%size 1471 1518 ENDDO 1472 offset=offset+recv%size 1473 ENDDO 1519 ELSE 1520 DO d3=lbegin,lend 1521 DO n=1,recv%size 1522 rval3d(value(n),d3)=buffer_r(n+offset) 1523 ENDDO 1524 offset=offset+recv%size 1525 ENDDO 1526 ENDIF 1527 1528 CALL trace_end("copy_from_buffer") 1474 1529 ENDIF 1475 1530 ENDDO … … 1485 1540 1486 1541 DO ind=1,ndomain 1487 IF (.NOT. assigned_domain(ind) .OR. .NOT. is_omp_level_master) CYCLE1542 IF (.NOT. assigned_domain(ind) ) CYCLE 1488 1543 1489 1544 rval4d=>field(ind)%rval4d … … 1498 1553 1499 1554 dim3=size(rval4d,2) 1555 CALL distrib_level(dim3,lbegin,lend) 1500 1556 dim4=size(rval4d,3) 1501 offset=recv%offset*dim3*dim41557 CALL trace_start("copy_from_buffer") 1502 1558 DO d4=1,dim4 1503 DO d3=1,dim3 1559 offset=recv%offset*dim3*dim4 + dim3*recv%size*(d4-1) + (lbegin-1)*recv%size 1560 DO d3=lbegin,lend 1504 1561 DO n=1,recv%size 1505 1562 rval4d(value(n),d3,d4)=buffer_r(n+offset)*sgn(n) … … 1508 1565 ENDDO 1509 1566 ENDDO 1567 CALL trace_end("copy_from_buffer") 1510 1568 ENDIF 1511 1569 ENDDO … … 1521 1579 !$OMP END MASTER 1522 1580 1523 CALL trace_end("transfert_mpi")1581 ! CALL trace_end("wait_message_mpi") 1524 1582 !$OMP BARRIER 1525 1583 … … 1728 1786 1729 1787 END SUBROUTINE scatter_field 1730 1731 1732 1788 1733 1789 SUBROUTINE trace_in 1734 1790 USE trace … … 1752 1808 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1753 1809 1754 !! -- Les chaine de charact ère -- !!1810 !! -- Les chaine de charactï¿œre -- !! 1755 1811 1756 1812 SUBROUTINE bcast_mpi_c(var1) … … 1949 2005 IF (.NOT. using_mpi) RETURN 1950 2006 1951 CALL MPI_BCAST(Var,nb,MPI_REAL ,mpi_master,comm_icosa,ierr)2007 CALL MPI_BCAST(Var,nb,MPI_REAL8,mpi_master,comm_icosa,ierr) 1952 2008 1953 2009 END SUBROUTINE bcast_mpi_rgen
Note: See TracChangeset
for help on using the changeset viewer.