- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我使用 Send/Recv 时,我的代码可以工作,但是当我用 Isend/Irecv 替换 Send/Recv 时,它会产生段错误。但在去其他地方之前,我想验证一下以下代码片段是否看起来很重要。
其余代码应该没问题,因为 Send/Recv 可以正常工作;但我没有粘贴到这里,因为它的代码很长。
INTEGER :: IERR,TASKID,NUMTASKS,SPANX,SPANY,SPANZ,PROCSX,PROCSY,PROCSZ,STAT,STATUS(MPI_STATUS_SIZE),ISTAT(MPI_STATUS_SIZE,52)
INTEGER,DIMENSION(1:52) :: REQ
ALLOCATE(RCC(IIST:IIEND,JJST:JJEND,KKST:KKEND),STAT=IERR)
IF (IERR /=0) PRINT*,'ERROR IN RCC BY',TASKID
DO I=1,52
REQ(I)=MPI_REQUEST_NULL
ENDDO
IF (TASKID.NE.0) THEN
NT=TASKID
CALL MPI_ISEND(RCC(IIST:IIEND,JJST:JJEND,KKST:KKEND),SIZE(RCC),MPI_DOUBLE_PRECISION,0,8,MPI_COMM_WORLD,REQ(NT),IERR)
ENDIF
IF (TASKID.EQ.0) THEN
DO NT = 1,26
CALL MPI_IRECV(CC(RSPANX(NT):RSPANXE(NT),RSPANY(NT):RSPANYE(NT),RSPANZ(NT):RSPANZE(NT)),SIZECC(NT),MPI_DOUBLE_PRECISION,NT,8,MPI_COMM_WORLD,REQ(NT+26),IERR)
ENDDO
ENDIF
CALL MPI_WAITALL(52,REQ,ISTAT,IERR)
DEALLOCATE(RCC,STAT=IERR)
IF (IERR /=0) PRINT*,'ERROR IN DEALLOCATE RCC BY',TASKID
CALL MPI_FINALIZE(IERR)
RETURN
END
但是,当我使用 Isend/Irecv 时,以下行不会出现段错误。
CALL MPI_IRECV(CC(RSPANX(NT),RSPANY(NT),RSPANZ(NT)),SIZECC(NT),MPI_DOUBLE_PRECISION,NT,8,MPI_COMM_WORLD,REQ(NT+26),IERR)
最佳答案
使用数组部分调用异步通信例程,例如 MPI_ISEND
和 MPI_IRECV
,例如RCC(IIST:IIEND,JJST:JJEND,KKST:KKEND)
,非常危险。原因是,由于旧的 Fortran 标准的限制,大多数 MPI 实现没有为这些例程提供适当的接口(interface),并且编译器将数据从数组部分复制到临时连续存储中,然后将其传递给子例程。发生段错误的原因可能是在实际数据传输发生之前从 MPI_ISEND
/MPI_IRECV
返回时释放了该临时存储。您可以通过手动分配连续数组并将数据复制到其中来防止这种情况发生。
另一方面,CC(RSPANX(NT),RSPANY(NT),RSPANZ(NT))
并不是指数组的一部分,而是指单个元素的位置。在这种情况下,不会创建数据的临时副本。
MPI-3.0 提供了一组改进的 Fortran 绑定(bind) mpi_f08
,它使用 Fortran 2008 和 TS 29113 中的现代功能来使用 ASYNCHRONOUS
属性标记此类参数,并启用安全传递不同维度的数组 (TYPE(*), DIMENSION(..)
)
关于fortran - Isend/Irecv 不起作用,但 Send/Recv 起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18303064/
下面是一个简单的代码,它使用 Isend 将处理器 i 的数据发送到 i+1 并探测所有发送是否完成。 代码: std::vector sendbuffer; int myrank, nprocs;
本文整理了Java中cyclops.data.Zipper.isEnd()方法的一些代码示例,展示了Zipper.isEnd()的具体用法。这些代码示例主要来源于Github/Stackoverflo
需要澄清我对 Send Types 中给出的 isend 和 issend 的理解 我的理解是,一旦发送缓冲区空闲,即当所有数据都被释放时,isend 将返回。另一方面,Issend 仅在它从获取/未
本文整理了Java中bitronix.tm.internal.XAResourceHolderState.isEnded()方法的一些代码示例,展示了XAResourceHolderState.isE
我在使用 Isend 和 Ireceive 时遇到问题。我试图向所有其他处理器发送消息,然后从其他处理器接收相同类型的消息,这些处理器执行相同的 Isend 方法。 void msgs(int my_
在 related question 中我了解到执行 request = Isend(...);接收(...); request.Wait(); 不保证工作,因为 Isend 可能不会做任何事情,直到
我的 MPI_Isend 和 MPI_Irecv 代码块有问题。我需要将一个数字 Cin 发送到生产线上的下一个流程,然后当前流程才能处理它的业务。 接收进程需要接收才能继续计算,但是当我没有 MPI
一个看似愚蠢的问题,但我似乎无法以任何方式找到明确的答案。 基本问题是我是否需要为 MPI::Isend 提供相应的 MPI::Irecv? 也就是说,即使消息发送是非阻塞的,只要我在重用发送缓冲区之
当我使用 Send/Recv 时,我的代码可以工作,但是当我用 Isend/Irecv 替换 Send/Recv 时,它会产生段错误。但在去其他地方之前,我想验证一下以下代码片段是否看起来很重要。 其
当使用序列化数据对同一标签执行多个 isend/irecv 传输时,我发现 boost::mpi 出现了 MPI_ERR_TRUNCATE 错误。这些不是并发传输,即不涉及线程。同时只有不止一项未完成
我正在尝试并行生成导数矩阵。我有两个线程的整个热方程求解器,但现在我试图找出如何将底行发送到下一个级别的 rec2,并将顶行发送到上一个级别的 rec1。我试着弄乱请求矩阵中的数字,但没有任何效果。出
在我的矩阵加法代码中,我使用 ISend 和 Tag 1 将下限传输到其他进程,但是当我编译代码时,所有其他从属进程都声称具有相同的下限。我不明白为什么? 输出: I am process 1 and
我正在创建一个程序来使用 MPI 计算两个导体之间的电势。我正在使用非阻塞发送和接收,因此可以在处理器之间发送信息时进行计算。 但是,isend 和 irecv 之间的 if 语句以及包含计算的 wa
我是一名优秀的程序员,十分优秀!