大数据阵列MPI发送
Large Data Array MPI Send
使用Send/recv MPI发送大于250的数组。我该怎么做?使用这种属性会导致缓冲区错误。
我的数组是text1, text2, Text3。谢谢= D
#include <stdio.h>
#include <mpi.h>
#include <time.h>
#include <math.h>
#include <string.h>
#define maxn 12000 //AoLéo
#include <stdlib.h>
int max(int a,int b);
int LongestCommonSubsequence(char text[]);
static char search[] = "ab"; //array que irá ser buscado nos arrays
static const char alphanum[] ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
int stringLength = sizeof(alphanum) - 1;
int max(int a,int b)
{
return a>b?a:b;
}
int LongestCommonSubsequence(char text[]){
int Slength = strlen(search); //Procurado
int Tlength = strlen(text); //Procura
int iter,jter=0;
int common[Slength+1][Tlength+1];
for(iter=0; iter<=Slength; iter++){
for(jter=0; jter<=Tlength; jter++){
if(iter == 0 || jter == 0){
common[iter][jter] = 0;
}
else if(search[iter-1] == text[jter-1] ){
common[iter][jter] = common[iter-1][jter-1] + 1;
}
else{
common[iter][jter]= max(common[iter][jter-1],common[iter-1][jter]);
}
}
}
return common[Slength][Tlength];
}
main(int argc, char **argv)
{
double startwtime = 0.0, endwtime; //var de tempo de execução
int id;//id : Rank de um processo
int p;//p : Numero de Processos
char texto1[maxn];
char texto2[maxn];
char texto3[maxn];
//Inicializa os processos.
MPI_Init(&argc,&argv);
//determina o rank de um processo
MPI_Comm_rank(MPI_COMM_WORLD,&id);
//determina o numero de processos executando
MPI_Comm_size(MPI_COMM_WORLD,&p);
MPI_Status status;
//mostra dados
printf("Processo iniciado do id: %dn ",id);
printf("Numeros de processos p: %d n",p);
if(id==0)
{
startwtime = MPI_Wtime();//iniciando o contador de tempo
strcpy(texto1,"auhauhsushauhs");
strcpy(texto2, "oplpadasdasdasdasdafadvalk");
strcpy(texto3, "cbfgrwtgjyunyhs");
int lengthText1 = strlen(texto1);//Atribuindo o tamanho do vetor
int lengthText2 = strlen(texto2);//Atribuindo o tamanho do vetor
int lengthText3 = strlen(texto3);//Atribuindo o tamanho do vetor
printf("TAMANHO DO VETOR 1 >>>%d<<<", lengthText1);
printf("Enviando o tamanho dos vetores para os %d processadores....n", p);
MPI_Send(&lengthText1, 1, MPI_CHAR, 1, 0, MPI_COMM_WORLD);
MPI_Send(&lengthText2, 1, MPI_CHAR, 2, 0, MPI_COMM_WORLD);
MPI_Send(&lengthText3, 1, MPI_CHAR, 3, 0, MPI_COMM_WORLD);
printf("Enviando os dados para os %d processadores....n", p);
MPI_Send(texto1, lengthText1, MPI_CHAR, 1, 0, MPI_COMM_WORLD);
MPI_Send(texto2, lengthText2, MPI_CHAR, 2, 0, MPI_COMM_WORLD);
MPI_Send(texto3, lengthText3, MPI_CHAR, 3, 0, MPI_COMM_WORLD);
printf("Dados enviados com sucesso!n");
}
if(id == 1){
int answer;
int lengthText1;
MPI_Recv(&lengthText1, 1, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);//Recebendo o tamanho do vetor
MPI_Recv(texto1, lengthText1, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);//Recebendo o vetor
printf("Dados recebidos com sucesso no processador: %d n", id);
answer = LongestCommonSubsequence(texto1);
printf("Resposta do processador %d eh de %d incidenciasn", id, answer);
MPI_Send(&answer, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
}
if(id == 2){
int answer;
int lengthText2;
MPI_Recv(&lengthText2, 1, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);//Recebendo o tamanho do vetor
MPI_Recv(texto2, lengthText2, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);//Recebendo o vetor
printf("Dados recebidos com sucesso no processador: %d n", id);
answer = LongestCommonSubsequence(texto2);
printf("Resposta do processador %d eh de %d incidenciasn", id, answer);
MPI_Send(&answer, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
}
if(id == 3){
int answer;
int lengthText3;
MPI_Recv(&lengthText3, 1, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);//Recebendo o tamanho do vetor
MPI_Recv(texto3, lengthText3, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);//Recebendo o vetor
printf("Dados recebidos com sucesso no processador: %d n", id);
answer = LongestCommonSubsequence(texto3);
printf("Resposta do processador %d eh de %d incidenciasn", id, answer);
MPI_Send(&answer, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
}
//Retorno do Jedi
if(id == 0 ){
int answer=0;
int i;
int respostas[2];
endwtime = MPI_Wtime();
printf("Recebendo dados dos processadoresn");
for(i=1; i<4; i++){
MPI_Recv(&answer, 1, MPI_INT, i, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
respostas[i] = answer;
answer=0;
}
printf("Dados recebidos com sucesso no servidor!n");
for(i=1; i<4; i++){
printf("Incidencias no noh %d foi de: %dn", i, respostas[i]);
}
printf("nn************ Tempo de execucao foi de %.4f segundos ***********n", endwtime-startwtime);
}
MPI_Finalize(); //Finalizar MPI
}
我正在使用动态规划,我是3节+服务器。
这并不奇怪。您正在使用MPI数据类型MPI_CHAR
来发送和接收字符串长度。这只发送1个字节。使用MPI_INT
作为MPI数据类型来发送完整的4字节整数:
// what you are doing:
MPI_Send(&lengthText1, 1, MPI_CHAR, 1, 0, MPI_COMM_WORLD);
// ... and
MPI_Recv(&lengthText1, 1, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
// what you should be doing:
MPI_Send(&lengthText1, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
// ... and
MPI_Recv(&lengthText1, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
需要注意的是,在发送之前有MPI_Probe
来获取数组的大小。不必有两个MPI_Send
调用。此外,您可以使用符合c++标准的动态大小的数组,并且只需使用std::string
。
template<typename T>
struct ManagedArray { // for RAII on dynamic arrays
T* data;
ManagedArray() : data(nullptr) { }
ManagedArray(size_t size) : data(new T[size]) { }
~ManagedArray() { delete data; }
};
string mpi_recvString(int rank, int source) {
MPI_Status status_recv;
MPI_Probe(source, 0, MPI_COMM_WORLD, &status_recv);
int size;
MPI_Get_count(&status_recv, MPI_CHAR, &size);
cout << rank << ": Will receive " << size << " chars." << endl;
ManagedArray<char> arr(size);
MPI_Recv(arr.data, size, MPI_CHAR, source, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
cout << rank << ": Received: " << arr.data << ". (length " << string(arr.data).length() << ")" << endl;
return arr.data;
}
如果有人也想看mpi_sendString
:
void mpi_sendString(int rank, const string& s, int dest) {
cout << rank << ": Sending " << s << ". (length " << s.length() << ")" << endl;
// Actually send s.size() + 1 chars, since s.c_str() is null-terminated.
MPI_Send(s.c_str(), s.size() + 1, MPI_CHAR, dest, 0, MPI_COMM_WORLD);
}
相关文章:
- 通过 mpi 发送 c++ 标准::矢量<bool>
- 如何通过Boost.MPI发送2d Boost.MultiArray的子阵列?
- 如何通过 mpi c++ 发送布尔数据类型?
- 混合开放MP/MPI代码中的多线程发送/接收时出错
- 在MPI中发送动态分配的2D数组的列
- 特征压缩稀疏矩阵的 MPI 接收和发送
- MPI 发送出现分段错误
- C++ MPI 发送接收问题
- MPI C 逐行向所有进程子进程发送矩阵 (MPI_COMM_SPAWN)
- 时间效率的设计模型,用于从所有MPI流程发送和接收:MPI全部2个通信
- MPI发送/recv的向量
- 什么是通过MPI发送OpenCV垫的最佳方法
- 使用MPI发送2D阵列
- C MPI创建并发送具有字段char [16]和整数的结构数组
- MPI-如何将杂志发送到阵列中的特定位置
- 如何通过Boost::MPI发送2d C风格的数组
- MPI中异步发送的安全保证
- 可以使用 MPI::Send 发送的最大数据量
- 使用MPI和C 发送静态内存2D数组
- MPI发送RECV输入参数