루프에서 데이터를 보내고받는 방법

시바 스 리니 바스 콜루 쿨라

do 루프에서 데이터를 보내고받는 데 문제가 있습니다. 아래 코드를 확인하십시오.

  include 'mpif.h'
  parameter (NRA = 4)
  parameter (NCA = 4)
  parameter (MASTER = 0)
  parameter (FROM_MASTER = 1)
  parameter (FROM_WORKER = 2)

  integer   numtasks,taskid,numworkers,source,dest,mtype,
 &          cols,avecol,extra, offset,i,j,k,ierr,rc
  integer status(MPI_STATUS_SIZE)
  real*8    a(NRA,NCA)

  call MPI_INIT( ierr )
  call MPI_COMM_RANK( MPI_COMM_WORLD, taskid, ierr )
  call MPI_COMM_SIZE( MPI_COMM_WORLD, numtasks, ierr )
  numworkers = numtasks-1  
  print *, 'task ID= ',taskid
C *************************** master task *************************************
  if (taskid .eq. MASTER) then
  if (numworkers .NE. 2) then 
     print *, 'Please use 3 processors'
     print *,'Quitting...'
    call MPI_ABORT(MPI_COMM_WORLD,rc,ierr)
  endif
 C     Initialize A and B 
    do 30 i=1, NRA
      do 30 j=1, NCA
      a(i,j) = (i-1)+(j-1)
30     continue
C     Send matrix data to the worker tasks 
    avecol = NCA/numworkers
    extra = mod(NCA,numworkers)
    offset = 1
    mtype = FROM_MASTER
    do 50 dest=1, numworkers
      if (dest .le. extra) then
        cols = avecol + 1
      else
        cols = avecol
      endif
      write(*,*)'   sending',cols,' cols to task',dest
      call MPI_SEND(offset,1,MPI_INTEGER,dest,mtype, 
 &                   MPI_COMM_WORLD,ierr)
      call MPI_SEND(cols,1,MPI_INTEGER,dest,mtype, 
 &                   MPI_COMM_WORLD,ierr)
      call MPI_SEND(a(1,offset),cols*NRA,MPI_DOUBLE_PRECISION,
 &                   dest,mtype,MPI_COMM_WORLD,ierr )
      offset = offset + cols
50     continue
C     Receive results from worker tasks
    mtype = FROM_WORKER
    do 60 i=1, numworkers
      source = i
      call MPI_RECV(offset,1,MPI_INTEGER,source,
 &                   mtype,MPI_COMM_WORLD,status,ierr )
      call MPI_RECV(cols,1,MPI_INTEGER,source,
 &                   mtype,MPI_COMM_WORLD,status,ierr )
      call MPI_RECV(a(1,offset),cols*NRA,MPI_DOUBLE_PRECISION, 
 &                   source,mtype,MPI_COMM_WORLD,status,ierr)
60     continue
C     Print results 
    do 90 i=1, NRA
      do 80 j = 1, NCA
        write(*,70)a(i,j)
70        format(2x,f8.2,$)
80      continue
      print *, ' '
90    continue
  endif
C *************************** worker task *************************************
  if (taskid > MASTER) then
C     Receive matrix data from master task
    mtype = FROM_MASTER
    call MPI_RECV(offset,1,MPI_INTEGER,MASTER,
 &                 mtype,MPI_COMM_WORLD,status,ierr)
    call MPI_RECV( cols,1,MPI_INTEGER,MASTER,
 &                 mtype,MPI_COMM_WORLD,status,ierr)
    call MPI_RECV(a(1,offset),cols*NCA,MPI_DOUBLE_PRECISION,MASTER,
 &                 mtype,MPI_COMM_WORLD,status,ierr)
 start0 = offset
 end0 = offset+cols-1
 C     Do matrix multiply
    do t=1,5
      do i=1, NRA
        do j=start0,end0
          a(i,j) = a(i,j)*t
        enddo
      enddo
 C     Send results back to master task
    mtype = FROM_WORKER
    call MPI_SEND(offset,1,MPI_INTEGER,MASTER,mtype, 
 &                 MPI_COMM_WORLD,ierr)
    call MPI_SEND(cols,1,MPI_INTEGER,MASTER,mtype, 
 &                 MPI_COMM_WORLD,ierr)
    call MPI_SEND(a(1,offset),cols*NCA,MPI_DOUBLE_PRECISION,MASTER,
 &                  mtype,MPI_COMM_WORLD,ierr)
 enddo
  endif
  call MPI_FINALIZE(ierr)
  end

ado 루프 내부의 화면에 매번 matrix를 인쇄하고 싶습니다 . 코드를 실행하면 한 번만 인쇄됩니다. 즉, do 루프 ( t= 1) 의 처음으로 인쇄됩니다 . 이 코드를 수정하여 계산 a된 후 매번 화면에 매트릭스를 인쇄 할 수 있도록하는 방법입니다.

시바 스 리니 바스 콜루 쿨라

알았어. 슬레이브에서 데이터를받는 동안 마스터에 루프를 넣어야합니다. 수정 된 코드입니다.

  include 'mpif.h'

  parameter (NRA = 4)
  parameter (NCA = 4)
  parameter (MASTER = 0)
  parameter (FROM_MASTER = 1)
  parameter (FROM_WORKER = 2)

  integer   numtasks,taskid,numworkers,source,dest,mtype,
 &          cols,avecol,extra, offset,i,j,k,ierr,rc
  integer status(MPI_STATUS_SIZE)
  real*8    a(NRA,NCA)

  call MPI_INIT( ierr )
  call MPI_COMM_RANK( MPI_COMM_WORLD, taskid, ierr )
  call MPI_COMM_SIZE( MPI_COMM_WORLD, numtasks, ierr )
  numworkers = numtasks-1  
  print *, 'task ID= ',taskid

  C *************************** master task *************************************
  if (taskid .eq. MASTER) then
  if (numworkers .NE. 2) then 
     print *, 'Please use 3 processors'
     print *,'Quitting...'
    call MPI_ABORT(MPI_COMM_WORLD,rc,ierr)
  endif
  C     Initialize A and B 
    do 30 i=1, NRA
      do 30 j=1, NCA
      a(i,j) = (i-1)+(j-1)
 30     continue

 C     Send matrix data to the worker tasks 
    avecol = NCA/numworkers
    extra = mod(NCA,numworkers)
    offset = 1
    mtype = FROM_MASTER
    do 50 dest=1, numworkers
      if (dest .le. extra) then
        cols = avecol + 1
      else
        cols = avecol
      endif
      write(*,*)'   sending',cols,' cols to task',dest
      call MPI_SEND(offset,1,MPI_INTEGER,dest,mtype, 
 &                   MPI_COMM_WORLD,ierr)
      call MPI_SEND(cols,1,MPI_INTEGER,dest,mtype, 
 &                   MPI_COMM_WORLD,ierr)
      call MPI_SEND(a(1,offset),cols*NRA,MPI_DOUBLE_PRECISION,
 &                   dest,mtype,MPI_COMM_WORLD,ierr )
      offset = offset + cols
50     continue

C     Receive results from worker tasks
    do t = 1,5
    mtype = FROM_WORKER
    do 60 i=1, numworkers
      source = i
      call MPI_RECV(offset,1,MPI_INTEGER,source,
 &                   mtype,MPI_COMM_WORLD,status,ierr )
      call MPI_RECV(cols,1,MPI_INTEGER,source,
 &                   mtype,MPI_COMM_WORLD,status,ierr )
      call MPI_RECV(a(1,offset),cols*NRA,MPI_DOUBLE_PRECISION, 
 &                   source,mtype,MPI_COMM_WORLD,status,ierr)
60     continue
C     Print results 
    do 90 i=1, NRA
      do 80 j = 1, NCA
        write(*,70)a(i,j)
70        format(2x,f8.2,$)
80      continue
      print *, ' '
90    continue 
    end do


  endif

C *************************** worker task *************************************
  if (taskid > MASTER) then
C     Receive matrix data from master task
    mtype = FROM_MASTER
    call MPI_RECV(offset,1,MPI_INTEGER,MASTER,
 &                 mtype,MPI_COMM_WORLD,status,ierr)
    call MPI_RECV( cols,1,MPI_INTEGER,MASTER,
 &                 mtype,MPI_COMM_WORLD,status,ierr)
    call MPI_RECV(a(1,offset),cols*NCA,MPI_DOUBLE_PRECISION,MASTER,
 &                 mtype,MPI_COMM_WORLD,status,ierr)
 start0 = offset
 end0 = offset+cols-1

C     Do matrix multiply
    do t=1,5
      do i=1, NRA
        do j=start0,end0
          a(i,j) = a(i,j)*t
        enddo
      enddo     
 C     Send results back to master task
    mtype = FROM_WORKER
    call MPI_SEND(offset,1,MPI_INTEGER,MASTER,mtype, 
 &                 MPI_COMM_WORLD,ierr)
    call MPI_SEND(cols,1,MPI_INTEGER,MASTER,mtype, 
 &                 MPI_COMM_WORLD,ierr)
    call MPI_SEND(a(1,offset),cols*NCA,MPI_DOUBLE_PRECISION,MASTER,
 &                  mtype,MPI_COMM_WORLD,ierr)
 enddo
  endif
  call MPI_FINALIZE(ierr)
  end

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

curl에서 데이터를 보내고받는 방법

분류에서Dev

내 모듈에서 BinaryConnection을 사용하여 데이터를 보내고받는 방법

분류에서Dev

Ratchet을 사용하여 서버에서 데이터를 보내고받는 방법

분류에서Dev

무한 루프에서받은 데이터를 파일에 쓰는 방법

분류에서Dev

RecyclerView에서 데이터를 읽고 BottomSheet로 보내는 방법

분류에서Dev

Javascript로 양식 데이터를 보내고받는 방법

분류에서Dev

플러터에서 뷰간에 인수를 보내고받는 방법

분류에서Dev

Java로 데이터를 받으면 서버에서 데이터를 받아 서버로 보내는 프로그램을 만드는 방법

분류에서Dev

Python : csv를 읽고 루프에서 데이터를 정리하는 방법

분류에서Dev

Android의 서버에서 프로그래밍 방식으로 이미지를 보내고받는 방법

분류에서Dev

Android 드래그 앤 드롭에서 Clipdata를 통해 여러 데이터 및 데이터 유형을 보내고받는 방법은 무엇입니까?

분류에서Dev

루프 내에서 전달한 데이터를 덮어 쓰는 방법

분류에서Dev

Java에서 소켓을 통해 객체를 보내고받는 방법

분류에서Dev

루프에서 생성기로 데이터를 보내는 Python 가장 깨끗한 방법

분류에서Dev

foreach 루프에서 동적 테이블 데이터를 나열하는 방법

분류에서Dev

루프에서 결과를 CSV로 내보내는 방법

분류에서Dev

서버에 요청을 보내고 데이터를 얻는 방법

분류에서Dev

for 루프 내에서 데이터베이스를 업데이트하는 방법은 무엇입니까?

분류에서Dev

sqlite android에서 루프로 추가 데이터를 제한하는 방법

분류에서Dev

foreach 루프에서 처음 두 데이터를 인쇄하는 방법

분류에서Dev

루프에서 데이터 구조를 갖는 Clojure와 같은 방법

분류에서Dev

foreach 루프에서 PDO의 데이터를 표시하는 방법

분류에서Dev

Android 서버로 이모티콘 스마일을 보내고받는 방법 (API)

분류에서Dev

R의 SQL에서 데이터를 내보내는 방법

분류에서Dev

hbase에서 SQL Server로 데이터를 내보내는 방법

분류에서Dev

Python에는 루프에서 데이터 프레임을 만들고 데이터 프레임 이름에 숫자를 사용하는 방법이 있습니까?

분류에서Dev

Ruby 루프 내에서 XPath 루프를 사용하는 방법

분류에서Dev

PHP 배열 for-each 루프에서 중복되지 않은 루프 데이터를 실행하는 방법

분류에서Dev

Python Pandas를 사용하여 루프 내에서 여러 데이터 프레임을 결합하는 방법

Related 관련 기사

  1. 1

    curl에서 데이터를 보내고받는 방법

  2. 2

    내 모듈에서 BinaryConnection을 사용하여 데이터를 보내고받는 방법

  3. 3

    Ratchet을 사용하여 서버에서 데이터를 보내고받는 방법

  4. 4

    무한 루프에서받은 데이터를 파일에 쓰는 방법

  5. 5

    RecyclerView에서 데이터를 읽고 BottomSheet로 보내는 방법

  6. 6

    Javascript로 양식 데이터를 보내고받는 방법

  7. 7

    플러터에서 뷰간에 인수를 보내고받는 방법

  8. 8

    Java로 데이터를 받으면 서버에서 데이터를 받아 서버로 보내는 프로그램을 만드는 방법

  9. 9

    Python : csv를 읽고 루프에서 데이터를 정리하는 방법

  10. 10

    Android의 서버에서 프로그래밍 방식으로 이미지를 보내고받는 방법

  11. 11

    Android 드래그 앤 드롭에서 Clipdata를 통해 여러 데이터 및 데이터 유형을 보내고받는 방법은 무엇입니까?

  12. 12

    루프 내에서 전달한 데이터를 덮어 쓰는 방법

  13. 13

    Java에서 소켓을 통해 객체를 보내고받는 방법

  14. 14

    루프에서 생성기로 데이터를 보내는 Python 가장 깨끗한 방법

  15. 15

    foreach 루프에서 동적 테이블 데이터를 나열하는 방법

  16. 16

    루프에서 결과를 CSV로 내보내는 방법

  17. 17

    서버에 요청을 보내고 데이터를 얻는 방법

  18. 18

    for 루프 내에서 데이터베이스를 업데이트하는 방법은 무엇입니까?

  19. 19

    sqlite android에서 루프로 추가 데이터를 제한하는 방법

  20. 20

    foreach 루프에서 처음 두 데이터를 인쇄하는 방법

  21. 21

    루프에서 데이터 구조를 갖는 Clojure와 같은 방법

  22. 22

    foreach 루프에서 PDO의 데이터를 표시하는 방법

  23. 23

    Android 서버로 이모티콘 스마일을 보내고받는 방법 (API)

  24. 24

    R의 SQL에서 데이터를 내보내는 방법

  25. 25

    hbase에서 SQL Server로 데이터를 내보내는 방법

  26. 26

    Python에는 루프에서 데이터 프레임을 만들고 데이터 프레임 이름에 숫자를 사용하는 방법이 있습니까?

  27. 27

    Ruby 루프 내에서 XPath 루프를 사용하는 방법

  28. 28

    PHP 배열 for-each 루프에서 중복되지 않은 루프 데이터를 실행하는 방법

  29. 29

    Python Pandas를 사용하여 루프 내에서 여러 데이터 프레임을 결합하는 방법

뜨겁다태그

보관