배열을 보내는 동안 MPI_Recv에서 오류가 발생했습니다.

니힐 아이 야데 바라
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
int main(int argc, char **argv)
{
    int N;
    scanf("%d", &N);
    double *a = (double *)malloc(N * sizeof(double));
    int i, rank, size, tag = 99, tag1 = 100;
    MPI_Status status;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    if (rank == 0) 
    {
        for(int j=0;j<N;++j)
        {
            a[j] = j+0.1;
        }
        for (i = 1; i < size; i++)
        {
            MPI_Send(&N, 1, MPI_INT, i, tag1, MPI_COMM_WORLD);
            MPI_Send(a, N, MPI_DOUBLE, i, tag, MPI_COMM_WORLD);
        }
    }
    else 
    {
        MPI_Recv(&N, 1, MPI_INT, 0, tag1, MPI_COMM_WORLD, &status);
        MPI_Recv(a, N, MPI_DOUBLE, 0, tag, MPI_COMM_WORLD, &status);
        // for(int j=0;j<N*2;++j)
            // printf("%d %f\n", rank, a[j]);
    }
    MPI_Barrier(MPI_COMM_WORLD);
    printf("Message from process %d : %f\n", rank, a[rank]);
    MPI_Finalize();
    return 0;
} 

0 번째 프로세스에서 배열 'a'를 만들고 나머지 프로세스로 보냅니다. 하지만 이렇게하면 다음과 같은 오류가 발생합니다.

[nikhil:8599] *** An error occurred in MPI_Recv
[nikhil:8599] *** reported by process [4228579329,1]
[nikhil:8599] *** on communicator MPI_COMM_WORLD
[nikhil:8599] *** MPI_ERR_BUFFER: invalid buffer pointer
[nikhil:8599] *** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
[nikhil:8599] ***    and potentially your MPI job)
[nikhil:08593] 2 more processes have sent help message help-mpi-errors.txt / mpi_errors_are_fatal
[nikhil:08593] Set MCA parameter "orte_base_help_aggregate" to 0 to see all help / error messages

아무도 내가이 오류가 발생하는 이유를 설명 할 수 있습니까?

코드에서 볼 수 있듯이 주석 처리 된 print 문을 포함하는 for 루프가 있습니다. 이상한 점은 ... 해당 루프의 주석 처리를 해제하는 것입니다. 잘 작동합니다.

Richard

생각 :

  1. MPI_Init 프로그램에서 가장 먼저해야합니다.
  2. 하나의 등급 만해야합니다 scanf.
  3. N 순위간에 통신되지 않으므로 정의되지 않은 크기의 메모리를 할당합니다.
  4. 가능한 한 사용 지점에 가깝게 변수를 정의하십시오. int i기능의 최상위에 두는 것은 재앙이 일어나기를 기다리고 있습니다.
  5. 끝에있는 장벽은 불필요합니다.
  6. 모든 계급은 자신의 메모리를 할당해야합니다.

이 코드는 다음과 같습니다.

#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"

int main(int argc, char **argv){
    MPI_Init(&argc, &argv);

    const int tag = 99;
    const int tag1 = 100;

    int rank, size;
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    double *a; //Pointer to the memory we will allocate
    int N;

    if (rank == 0){
        scanf("%d", &N);

        a = (double *)malloc(N * sizeof(double));

        for(int j=0;j<N;++j){
            a[j] = j+0.1;
        }
        for (int i = 1; i < size; i++){
            MPI_Send(&N, 1, MPI_INT, i, tag1, MPI_COMM_WORLD);
            MPI_Send(a, N, MPI_DOUBLE, i, tag, MPI_COMM_WORLD);
        }
    } else {
        MPI_Status status;
        MPI_Recv(&N, 1, MPI_INT, 0, tag1, MPI_COMM_WORLD, &status);
        //Have to allocate memory on all ranks
        a = (double *)malloc(N * sizeof(double)); 
        MPI_Recv(a, N, MPI_DOUBLE, 0, tag, MPI_COMM_WORLD, &status);
        // for(int j=0;j<N*2;++j)
            // printf("%d %f\n", rank, a[j]);
    }

    printf("Message from process %d : %f\n", rank, a[rank]);

    MPI_Finalize();
    return 0;
} 

더 잘하기

브로드 캐스트 명령은 여기에서 친구입니다.

#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"

#define MPI_Error_Check(x) {const int err=x; if(x!=MPI_SUCCESS) { fprintf(stderr, "MPI ERROR %d at %d.", err, __LINE__);}}

int main(int argc, char **argv){
    MPI_Init(&argc, &argv);

    int rank, size;
    MPI_Error_Check(MPI_Comm_rank(MPI_COMM_WORLD, &rank));
    MPI_Error_Check(MPI_Comm_size(MPI_COMM_WORLD, &size));

    int N;
    if (rank==0){
        scanf("%d", &N);
    }

    MPI_Error_Check(MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD));

    double *a = (double *)malloc(N * sizeof(double));

    if(rank==0){
        for(int j=0;j<N;++j){
            a[j] = j+0.1;
        }
    }

    printf("Message from process %d : N=%d\n", rank, N);

    MPI_Error_Check(MPI_Bcast(a, N, MPI_DOUBLE, 0, MPI_COMM_WORLD));

    fprintf(stderr, "Message from process %d : %f\n", rank, a[rank]);

    free(a);

    MPI_Finalize();
    return 0;
} 

더 잘하기

가장 빠른 형태의 의사 소통은 전혀 의사 소통을하지 않는 것입니다. 귀하의 경우 값 N이 알려 지면 각 순위가 자체적으로 데이터를 다시 만들 수 있습니다.

#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"

#define MPI_Error_Check(x) {const int err=x; if(x!=MPI_SUCCESS) { fprintf(stderr, "MPI ERROR %d at %d.", err, __LINE__);}}

int main(int argc, char **argv){
    MPI_Init(&argc, &argv);

    int rank, size;
    MPI_Error_Check(MPI_Comm_rank(MPI_COMM_WORLD, &rank));
    MPI_Error_Check(MPI_Comm_size(MPI_COMM_WORLD, &size));

    int N;
    if (rank==0){
        scanf("%d", &N);
    }

    MPI_Error_Check(MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD));

    double *a = (double *)malloc(N * sizeof(double));

    for(int j=0;j<N;++j){
        a[j] = j+0.1;
    }

    printf("Message from process %d : N=%d\n", rank, N);

    fprintf(stderr, "Message from process %d : %f\n", rank, a[rank]);

    free(a);

    MPI_Finalize();
    return 0;
} 

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

HttpClient에서 "요청을 보내는 동안 오류가 발생했습니다."

분류에서Dev

Fluxpoint API에 요청을 보내는 동안 오류가 발생했습니다.

분류에서Dev

내 배열에서 문자열을 검색하는 동안 오류가 발생했습니다.

분류에서Dev

Android의 목록보기에 문자열 배열을 넣는 동안 오류가 발생했습니다.

분류에서Dev

Apache에 Flask 앱을 배포하는 동안 오류가 발생했습니다.

분류에서Dev

C ++에서 동적 배열을 만드는 동안 메모리 오류가 발생했습니다.

분류에서Dev

Android에서 웹 서버로 사진을 보내는 동안 오류가 발생했습니다.

분류에서Dev

Angular에서 Firebase 푸시 알림을 보내는 동안 오류가 발생했습니다.

분류에서Dev

Jenkins에서 확장 이메일 알림을 보내는 동안 오류가 발생했습니다.

분류에서Dev

Android의 서버에 JSON을 보내는 동안 오류가 발생했습니다.

분류에서Dev

Android에서 Volley를 사용하여 HTTP GET 요청을 보내는 동안 오류가 발생했습니다.

분류에서Dev

배치 파일에서 두 문자열을 일치시키는 동안 오류가 발생했습니다.

분류에서Dev

Bash에서 배열을 함수 매개 변수로 전달하는 동안 오류가 발생했습니다.

분류에서Dev

int 배열을 Total 메서드에 전달하는 동안 오류가 발생했습니다.

분류에서Dev

ng-repeat에서 Json 배열을 사용하는 동안 오류가 발생했습니다.

분류에서Dev

폴더에서 배열 목록을 인쇄하는 동안 오류가 발생했습니다.

분류에서Dev

JavaScript에서 JSON 배열을 반복하는 동안 오류가 발생했습니다.

분류에서Dev

WSO2 ESB에 POST 요청을 보내는 동안 오류가 발생했습니다.

분류에서Dev

문서에`PdfPTable`을 추가하는 동안 오류가 발생했습니다.

분류에서Dev

Postgresql에 Json 배열을 삽입하는 동안 오류가 발생했습니다.

분류에서Dev

PL / pgSQL 저장 프로 시저에 배열을 전달하는 동안 오류가 발생했습니다.

분류에서Dev

스택에 배열을 할당하는 동안 런타임 오류가 발생했습니다.

분류에서Dev

코드에서 XML 값을 읽는 동안 오류가 발생했습니다.

분류에서Dev

R에서 csv 파일을 읽는 동안 오류가 발생했습니다.

분류에서Dev

jstl에서 맵을 반복하는 동안 오류가 발생했습니다.

분류에서Dev

각도에서 모달을 여는 동안 오류가 발생했습니다.

분류에서Dev

각도에서 모달을 여는 동안 오류가 발생했습니다.

분류에서Dev

R에서 if 문을 실행하는 동안 오류가 발생했습니다.

분류에서Dev

VBA에서 모양을 만드는 동안 오류가 발생했습니다.

Related 관련 기사

  1. 1

    HttpClient에서 "요청을 보내는 동안 오류가 발생했습니다."

  2. 2

    Fluxpoint API에 요청을 보내는 동안 오류가 발생했습니다.

  3. 3

    내 배열에서 문자열을 검색하는 동안 오류가 발생했습니다.

  4. 4

    Android의 목록보기에 문자열 배열을 넣는 동안 오류가 발생했습니다.

  5. 5

    Apache에 Flask 앱을 배포하는 동안 오류가 발생했습니다.

  6. 6

    C ++에서 동적 배열을 만드는 동안 메모리 오류가 발생했습니다.

  7. 7

    Android에서 웹 서버로 사진을 보내는 동안 오류가 발생했습니다.

  8. 8

    Angular에서 Firebase 푸시 알림을 보내는 동안 오류가 발생했습니다.

  9. 9

    Jenkins에서 확장 이메일 알림을 보내는 동안 오류가 발생했습니다.

  10. 10

    Android의 서버에 JSON을 보내는 동안 오류가 발생했습니다.

  11. 11

    Android에서 Volley를 사용하여 HTTP GET 요청을 보내는 동안 오류가 발생했습니다.

  12. 12

    배치 파일에서 두 문자열을 일치시키는 동안 오류가 발생했습니다.

  13. 13

    Bash에서 배열을 함수 매개 변수로 전달하는 동안 오류가 발생했습니다.

  14. 14

    int 배열을 Total 메서드에 전달하는 동안 오류가 발생했습니다.

  15. 15

    ng-repeat에서 Json 배열을 사용하는 동안 오류가 발생했습니다.

  16. 16

    폴더에서 배열 목록을 인쇄하는 동안 오류가 발생했습니다.

  17. 17

    JavaScript에서 JSON 배열을 반복하는 동안 오류가 발생했습니다.

  18. 18

    WSO2 ESB에 POST 요청을 보내는 동안 오류가 발생했습니다.

  19. 19

    문서에`PdfPTable`을 추가하는 동안 오류가 발생했습니다.

  20. 20

    Postgresql에 Json 배열을 삽입하는 동안 오류가 발생했습니다.

  21. 21

    PL / pgSQL 저장 프로 시저에 배열을 전달하는 동안 오류가 발생했습니다.

  22. 22

    스택에 배열을 할당하는 동안 런타임 오류가 발생했습니다.

  23. 23

    코드에서 XML 값을 읽는 동안 오류가 발생했습니다.

  24. 24

    R에서 csv 파일을 읽는 동안 오류가 발생했습니다.

  25. 25

    jstl에서 맵을 반복하는 동안 오류가 발생했습니다.

  26. 26

    각도에서 모달을 여는 동안 오류가 발생했습니다.

  27. 27

    각도에서 모달을 여는 동안 오류가 발생했습니다.

  28. 28

    R에서 if 문을 실행하는 동안 오류가 발생했습니다.

  29. 29

    VBA에서 모양을 만드는 동안 오류가 발생했습니다.

뜨겁다태그

보관