Форум программистов, компьютерный форум CyberForum.ru

MPI. Ошибка в выводимых данных. (Код присутствует) - C++

Восстановить пароль Регистрация
 
Байр
13 / 13 / 1
Регистрация: 09.12.2011
Сообщений: 64
29.10.2012, 22:40     MPI. Ошибка в выводимых данных. (Код присутствует) #1
Доброе время суток.
Программа должна пересылать данные от 3 процесса к 0, и от 0 к 3. Необхожимо использовать в работе функции передачи не вызывающие "тупиковые ситуации". Я выбрал MPI_Bsend(...) -пересылка с буферизацией. Поначалу я сделал с разделением на блоки, и программа выдавала "почти" правильный результат:
Procesor # 0 : High Voltage Rock'n'Roll!‰. //пара лишних символов
Procesor # 0 : 8.300000.
Procesor # 0 : Z.
Procesor # 3 : 2.
Как можно это исправить?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <mpi.h>
#define ROOT 0
#define BUFFSIZE 10000
#define MesSize 25
 
int main(int argc, char **argv) 
{
    int myrank, nprocs, namelen;
    char processor_name[MPI_MAX_PROCESSOR_NAME];    
    int MesTag=0;
    MPI_Status Status;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &nprocs); 
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank); 
    MPI_Get_processor_name(processor_name,&namelen);
    MPI_Buffer_attach(malloc(BUFFSIZE), BUFFSIZE);
    
    if(myrank == 3)
    { 
        char Message1[]="High Voltage Rock'n'Roll!";
        MPI_Bsend(Message1, MesSize, MPI_CHAR, 0, MesTag, MPI_COMM_WORLD);
        
        float Message2 = 8.3;   
        MPI_Bsend(&Message2, MesSize, MPI_FLOAT, 0, MesTag+2, MPI_COMM_WORLD); 
        
        char Message3[]="Z";
        MPI_Bsend(Message3, MesSize, MPI_CHAR, 0, MesTag+3, MPI_COMM_WORLD);   
        
        int Message4;
        MPI_Recv(&Message4, MesSize, MPI_INT, 0, MesTag+1, MPI_COMM_WORLD, &Status);    
        printf("Procesor # %d : %d.\n", myrank, Message4);        
         
    }    
    if(myrank == 0)
    {
        int Message5 = 2;  
        MPI_Bsend(&Message5, MesSize, MPI_INT, 3, MesTag+1, MPI_COMM_WORLD); 
         
        char Message6[10];
        MPI_Recv(Message6, MesSize, MPI_CHAR, 3, MesTag, MPI_COMM_WORLD, &Status); 
        printf("Procesor # %d : %s.\n", myrank, Message6); 
        
        float Message7;    
        MPI_Recv(&Message7, MesSize, MPI_FLOAT, 3, MesTag+2, MPI_COMM_WORLD, &Status); 
        printf("Procesor # %d : %f.\n", myrank, Message7);
        
        char Message8[1];      
        MPI_Recv(Message8, MesSize, MPI_CHAR, 3, MesTag+3, MPI_COMM_WORLD, &Status); 
        printf("Procesor # %d : %s.\n", myrank, Message8);      
    }
    MPI_Finalize();     
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2012, 22:40     MPI. Ошибка в выводимых данных. (Код присутствует)
Посмотрите здесь:

C++ Сортировка выводимых данных в алфавитном порядке
C++ Кол-во выводимых строк в консоли (размер буфера экрана)
C++ Разделение выводимых цифр пробелом.
Разделение выводимых данных C++
Отладка проекта с mpi: ошибка corrupted stack around variable C++
C++ Как сделать структуру (как в таблице) выводимых в консоле данных?
C++ Тип выводимых данных. abs() и fabs()
C++ Visual studio 2013 в документе xml (8,2) присутствует ошибка

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байр
13 / 13 / 1
Регистрация: 09.12.2011
Сообщений: 64
31.10.2012, 17:03  [ТС]     MPI. Ошибка в выводимых данных. (Код присутствует) #2
Я нашел как исправить данную ошибку. Хотя, правильнее сказать, она сама как-то исправилась) Как это произошло, я не знаю.
Выкладываю результат уже готовый программы, но что я скажу, иногда в MPI может произойти ошиба, даже в логически правильном коде:
C
1
2
char Message1[]="High Voltage Rock'n'Roll!";
        /*MPI_Bsend(Message1, MesSize, MPI_CHAR, 0, MesTag, MPI_COMM_WORLD);*/
отличается от
C
1
2
/*char Message1[]="High Voltage Rock'n'Roll!";
        MPI_Bsend(Message1, MesSize, MPI_CHAR, 0, MesTag, MPI_COMM_WORLD);*/
Ну и сам код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <mpi.h>
#define ROOT 0
#define BUFFSIZE 10000
#define MesSize 25
 
int main(int argc, char **argv) 
{
    int myrank, nprocs, namelen, MesTag=0;
    char processor_name[MPI_MAX_PROCESSOR_NAME];    
    MPI_Status Status;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &nprocs); 
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank); 
    MPI_Get_processor_name(processor_name,&namelen);
    MPI_Buffer_attach(malloc(BUFFSIZE), BUFFSIZE);
    if(myrank == 3)
    { 
        char Message1[]="High Voltage Rock'n'Roll!";
        MPI_Bsend(Message1, MesSize, MPI_CHAR, 0, MesTag, MPI_COMM_WORLD);
 
        float Message2 = 8.3;   
        MPI_Bsend(&Message2, MesSize, MPI_FLOAT, 0, MesTag+2, MPI_COMM_WORLD); 
        
        char Message3[]="Z";
        MPI_Bsend(Message3, MesSize, MPI_CHAR, 0, MesTag+3, MPI_COMM_WORLD);   
        
        int Message4;
        MPI_Recv(&Message4, MesSize, MPI_INT, 0, MesTag+1, MPI_COMM_WORLD, &Status);    
        printf("Procesor # %d : %d.\n", myrank, Message4);        
         
    }    
    if(myrank == 0)
    {
        int Message5 = 2;  
        MPI_Bsend(&Message5, MesSize, MPI_INT, 3, MesTag+1, MPI_COMM_WORLD); 
         
        char Message6[10];
        MPI_Recv(Message6, MesSize, MPI_CHAR, 3, MesTag, MPI_COMM_WORLD, &Status); 
        printf("Procesor # %d : %s.\n", myrank, Message6); 
        
        float Message7;    
        MPI_Recv(&Message7, MesSize, MPI_FLOAT, 3, MesTag+2, MPI_COMM_WORLD, &Status); 
        printf("Procesor # %d : %f.\n", myrank, Message7);
        
        char Message8[1];      
        MPI_Recv(Message8, MesSize, MPI_CHAR, 3, MesTag+3, MPI_COMM_WORLD, &Status); 
        printf("Procesor # %d : %s.\n", myrank, Message8);      
    }
    MPI_Finalize();     
    return 0;
}
Yandex
Объявления
31.10.2012, 17:03     MPI. Ошибка в выводимых данных. (Код присутствует)
Ответ Создать тему
Опции темы

Текущее время: 17:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru