用MPI_Send或MPI_Recv的限制?
我们对MPI_Send或MPI_Recv上的消息大小有任何限制 - 还是通过计算机限制?当我尝试发送大数据时,无法完成. 这是我的代码: #include #include #include #include #include void AllGather_ring(void* data, int count, MPI_Datatype datatype,MPI_Comm communicator) { int me; MPI_Comm_rank(communicator, &me); int world_size; MPI_Comm_size(communicator, &world_size); int next=me+1; if(next>=world_size) next=0; int prev=me-1; if(prev
0 2024-04-10
编程技术问答社区
为什么这段MPI代码的执行顺序不对?
我正在尝试创建一个"你好,世界!"在(打开)MPI中的应用程序,使每个过程都按顺序打印出来. 我的想法是让第一个过程在完成后向第二个消息发送到第二个消息,然后将消息发送到第三个,等等: : #include #include int main(int argc,char **argv) { int rank, size; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); // See: http://mpitutorial.com/mpi-send-and-receive/ if (rank == 0) { // This is the first process. // Print out immed
0 2024-04-10
编程技术问答社区
MPI_Scatter-不能按预期工作
我正在使用MPI编写我的第一个程序,并且很难使用MPI_ -Scast将数据正确发送到其他过程,修改它们并使用MPI_Gather接收值.代码如下: int** matrix; int m = 2, n = 2; int status; // could have been int matrix[2][2]; matrix = malloc(m*sizeof(int*)); for(i = 0; i
2 2024-04-09
编程技术问答社区
通过OpenMPI进行非阻塞式数据共享
我正在尝试使用OpenMPI将数据传播到多个工人中,但是,我正在以一种相当自定义的方式进行数据部门,而不是 不适合MPI_Scatter或MPI_Broadcast>.我想做的是在队列中给每个处理器一些工作(或其他一些异步机制),以便他们可以在第一批数据上完成工作,取下一个块,重复直到不再有块./p> 我知道MPI_Isend,但是,如果我以MPI_Isend发送数据,我无法修改它,直到它完成为止.强迫我使用MPI_Wait,因此必须等到线程到底收到数据完成! 是否有标准解决此问题的方法,还是我必须重新考虑我的方法? 解决方案 使用MPI_ISEND并不一定意味着该消息是在遥控端接收的.这只是意味着缓冲区可用于重复使用.可能是该消息已被Open MPI内部缓冲,或者实际上已经在另一端收到了该消息.这取决于您的消息大小. 另一种选择是让您的工人在需要工作时询问主过程,而不是将其推向他们.然后主人只能根据需要工作.您可以为第一个消息做MPI_SCATTER,因为每个人都
0 2024-04-09
编程技术问答社区
OpenMPI C语言scanf不会停止接受输入(Mac OS X 10.10)。
我正在尝试运行以下MPI代码.问题在于scanf.该命令继续输入,没有任何地方.它应该仅采用一个输入字符串. #include #include #include #include int main(int argc,char * argv[]) { int npes, myrank, length = 10; char string[length+1]; // array size changed to length +1 as suggested in comments. memset(string, 0, length+1); MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &npes); MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
2 2024-04-09
编程技术问答社区
试图安装openmpi的分段故障
我正在尝试安装OpenMPI,但是经过不同的尝试,我仍然无法使用它. 这是最后指南我跟随.我只是复制并粘贴每个命令行. 这是我运行时从终端中获得的内容:mpirun timmy@timmy-Lenovo-G50-80 ~/openmpi-1.8.1 $ mpirun [timmy-Lenovo-G50-80:21817] *** Process received signal *** [timmy-Lenovo-G50-80:21817] Signal: Segmentation fault (11) [timmy-Lenovo-G50-80:21817] Signal code: Address not mapped (1) [timmy-Lenovo-G50-80:21817] Failing at address: 0x7fab73035000 [timmy-Lenovo-G50-80:21817] [ 0] /lib/x86_64-linux-gnu/libpt
0 2024-04-09
编程技术问答社区
MPI_Barrier不能正常工作
我写了下面的C应用程序,以帮助我了解MPI,以及为什么MPI_BARRIER()在我的庞大的C ++应用程序中不起作用.但是,我能够在较小的C应用程序中重现我的庞大应用程序中的问题.从本质上讲,我在循环中调用mpi_barrier(),并且所有节点都可以看到mpi_barrier(),但是在循环进行了2次迭代后,程序将僵持.有任何想法吗? #include #include int main(int argc, char* argv[]) { MPI_Init(&argc, &argv); int i=0, numprocs, rank, namelen; char processor_name[MPI_MAX_PROCESSOR_NAME]; MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rank);
2 2024-04-09
编程技术问答社区
OpenMPI得到的是永远的等待
当我执行此代码时,我没有响应,它会等待,过程1将数据发送到根过程,但根过程没有接收它(或者几乎这是我认为的). #include #include #include "mpi.h" void my_parallel_function(int v[], int size, int rank) { MPI_Status status; int i; if(rank==0) { MPI_Send(&v[0], 10, MPI_INT, 1, 1, MPI_COMM_WORLD); } else { MPI_Recv(&v[0], 10, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD,&status); for(i=0;i
0 2024-04-09
编程技术问答社区
OpenMPI奇怪的输出错误
我在一个小集群上使用openMPI 1.3. 这是我正在调用的功能: void invertColor_Parallel(struct image *im, int size, int rank) { int i,j,aux,r; int total_pixels = (*im).ih.width * (*im).ih.height; int qty = total_pixels/(size-1); int rest = total_pixels % (size-1); MPI_Status status; //printf("\n%d\n", rank); if(rank == 0) { for(i=1; i
0 2024-04-09
编程技术问答社区
为什么mpirun不尊重我对BTL的选择?
我在Windows 7机器上使用Cygwin上的开放MPI(1.8.3).我想仅在任何外部网络上交谈,在该计算机上运行MPI代码.我知道我应该能够使用MCA选项将mpirun限制为自我和共享内存通信: mpirun -n 8 --mca btl sm,self ./hello.exe 但是,当我尝试此操作时,Windows问我是否想制作防火墙例外,表明我的工作试图通过TCP进行外部交谈.此外,当我在Hello World Job完成之前,Mpirun将悬挂大约一分钟,然后才完成,并且仅当我在无线网络上.如果我关闭无线卡或切换到有线以太网连接,则可以在一秒钟内按预期完成. 为什么mpirun不观察我对BTL的选择? 解决方案 为什么mpirun不观察我对BTL的选择? 绝对可以观察到您选择的BTL.但是还有另一个框架,即OOB,默认情况下也使用TCP.您应该禁用两个框架的tcp组件,以防止打开MPI完全使用TCP: mpirun -n 8 --mca
0 2024-04-09
编程技术问答社区
如果数据不可划分我的comm_ize,则比mpi_send/mpi_recv循环/mpi_recv更好?
我使用MPI程序进行并行化批次. 成像多维MRI图像(3个空间维度,线圈数据等),我们将其中几个汇总在批处理维度上. 该程序应沿批处理维度应用相同的任务. 我的问题现在我有nproc进程(comm_size),但是我的批次维度不可用nproc划分. mpi_ -scatter,或更精确的mpi_gather阻止应用程序. 我的问题: 是否有一种比使用mpi_send/mpi_recv进行循环更优雅/方便的方式来克服这个问题? 我发现了这个答案 但是恕我直言,它解释了一个不同的问题,因为我无法使用MPI_Scatterv更改发送/接收数据的量.请证明我错了:) 预先感谢! 在示例中mpirun -n 2 tut2 1000效果很好,但是mpirun -n 3 tut2 1000卡在mpi_gather之前. 取自#include #include #include #include
12 2024-04-09
编程技术问答社区
运行mpirun时数据类型无效
我有简单的程序,我想在几台计算机上散布结构,但是即使程序编译良好,我似乎已经错误地定义了数据类型.我有以下代码. #include #include #include typedef struct small_pixel_s { double red; double green; double blue; } SMALL_PIXEL; int main(int argc, char **argv) { int size, rank; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); SMALL_PIXEL global[8]; SMALL_PIXEL local[2]; const
2 2024-04-09
编程技术问答社区
用MPI_Gather openmpi c来收集字符串
我想在每个过程中生成一个字符串,然后收集所有内容.但是在每个过程中创建的字符串都是通过附加INT和字符创建的. 我仍然无法正确收集所有内容.我可以一一打印所有部分字符串,但是如果我尝试打印RCV_STRING,我只会得到一个部分字符串或一个分段故障. 我尝试将零放在字符串的末尾,并通过动态和静态地保留字符串的内存,但是我找不到路. 如果有人知道如何将字符串化并正确地完成目标,那将是很棒的. int main(int argc, char *argv[]) { int rank; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); char *string; // ???????????? char *rcv_string; // ???????????? if (rank == 0) { sprintf
2 2024-04-09
编程技术问答社区
MPI_Reduce不能按预期工作
我是MPI的新手,我正在尝试使用mpi_reduce找到最大的整数数组.我有一个大小arraysize的整数数组arr,这是我的代码: MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &number_of_processes); MPI_Comm_rank(MPI_COMM_WORLD, &my_process_id); MPI_Bcast(arr, arraysize, MPI_INT, 0, MPI_COMM_WORLD); MPI_Reduce(arr, &result, arraysize, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD); if(!my_process_id){ printf("%d", result); } MPI_Finalize(); 我的程序编译并在8个过程中运行,但没有任何问题,但是,屏幕上没有任何印刷.出于调试目的,我将条件变为if(my_pr
0 2024-04-09
编程技术问答社区
C, Open MPI:调用MPI_Finalize()时出现分段故障。Segfault并不总是发生,特别是在进程数量较少的情况下
我正在编写一个简单的代码,以学习如何定义mpi_datatype并将其与mpi_gatherv结合使用.我想确保我可以在一个过程上结合变量长度,动态分配的结构化数据数组,这似乎工作正常,直到我致电mpi_finalize().我已经确认这是通过使用打印语句和Eclipse PTP调试器(后端是GDB-MI)开始表现出来的问题.我的主要问题是,我如何摆脱分割错误? 每次运行代码时,不会发生SEGFAULT.例如,它没有发生2或3个过程,但是当我使用大约4个或更多过程运行时,往往会定期发生. 另外,当我使用Valgrind运行此代码时,不会发生分割故障.但是,我确实会从Valgrind那里收到错误消息,尽管即使使用大量目标抑制,我也很难理解输出我很难理解.我还担心,如果我使用更多抑制作用,我会沉默有用的错误消息. 我使用这些标志对普通代码进行编译,因此我在两种情况下都使用C99标准: -ansi -pedantic -wall -O2 -March =巴塞罗那-fomit
2 2024-04-08
编程技术问答社区
OpenMPI 1.4.3 mpirun hostfile错误
我正在尝试在4个节点上运行一个简单的MPI程序.我使用的是OpenMPI 1.4.3在CentOS 5.5上运行.当我使用hostfile/grinesefile提交Mpirun命令时,我没有输出,接收空白屏幕.因此,我必须杀死工作.. 我使用以下运行命令:: mpirun -hostfile hostfile -np 4 new46 OUTPUT ON KILLING JOB: mpirun: killing job... -------------------------------------------------------------------------- mpirun noticed that the job aborted, but has no info as to the process that caused that situation. ---------------------------------------------
0 2024-04-08
编程技术问答社区
如何强制OpenMPI使用GCC而不是ICC?有必要重新编译OpenMPI吗?
我有一个用于gcc编写的并行计算的C代码,我想在群集上编译它,显然可以通过mpicc使用icc.纠正代码为icc - 友好的友好似乎太时了,所以我想知道我是否可以要求OpenMPI使用gcc.我没有该集群上的管理员权利,实际上我宁愿不弄乱原始配置. 如果无法在例如中设置Makefile,那么我希望在主目录中可以编译OpenMPI,但是在此之后必须做的事情中,我需要一些指导.你能帮我吗? update1 Makefile包含 CC = mpicc CFLAGS += -DMPI 这是一些OpenMPI文件 $ which mpicc /usr/bin/mpicc lrwxr-xr-x /usr/bin/mpicc -> opal_wrapper -rwxr-xr-x /usr/bin/opal_wrapper 让我知道,如果我能为您提供更多信息. update2 使用 jeff的帮助,我能够找到OpenMPI的设置 $ more /
4 2024-04-08
编程技术问答社区
MPI、C、派生类型、向量的结构?
我需要创建一个MPI派生类型来代表程序中的类.该课程相当简单,但很大(大约75个数据成员**).所有数据成员都是单个值,1D数组或2D数组.这是一个示例: class RestartData { int dsr; double firea2sorgn; int ifwoody[NUM_PFT]; double rootfrac[MAX_ROT_LAY][NUM_PFT]; .... .... } 我认为使用MPI_Type_struct是合适的. (例如 org/doc/v1.5/man3/mpi_type_struct.3.php ) 和我或多或少地在此问题中遵循以下示例: struct在C中序列化并通过MPI传输,但我不确定如何处理2D阵列.我可以制作包含几个MPI_Type_vector s的MPI_Type_struct吗?我找不到创建包含2D数组的MPI_Type_struct的示例.我在正确的方法上吗? 预先感谢. **我认
0 2024-04-07
编程技术问答社区
使用MPI_Type_create_subarray发送时,可以转置阵列吗?
我正在尝试使用C中的MPI转换矩阵.每个过程都有一个Square subsatrix,我想将其发送到正确的过程(网格上的"相对"),将其作为该过程的一部分进行转换沟通. 我正在使用MPI_Type_create_subarray,该>分别对行和列 - 列和列 - 塔.我认为,如果我以其中之一的身份发送并作为另一个被收到,那么我的矩阵将作为通信的一部分进行转移.但是,这似乎并没有发生 - 它只是保持不转移. 代码的重要部分在下面,整个代码文件可在上获得此要素.有人有任何想法为什么不起作用吗?这种进行转置工作的方法应该吗?我以为会这样,因为阅读了MPI_ORDER_C和MPI_ORDER_FORTRAN的描述,但也许不是. /* ----------- DO TRANSPOSE ----------- */ /* Find the opposite co-ordinates (as we know it's a square) */ coords2[0] = coords[
0 2024-04-07
编程技术问答社区
OpenMPI MPI_Barrier问题
我使用mpi_barrier的OpenMPI实现存在一些同步问题: int rank; int nprocs; int rc = MPI_Init(&argc, &argv); if(rc != MPI_SUCCESS) { fprintf(stderr, "Unable to set up MPI"); MPI_Abort(MPI_COMM_WORLD, rc); } MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rank); printf("P%d\n", rank); fflush(stdout); MPI_Barrier(MPI_COMM_WORLD); printf("P%d again\n", rank); MPI_Finalize(); 对于Mpirun -n 2 ./a.out 输出应为: P0 P1 ... 输出是有时:
0 2024-04-07
编程技术问答社区