在开发基于 OpenMPI 的程序期间,我有时会遇到分段错误:
[11655] *** Process received signal ***
[11655] Signal: Segmentation fault (11)
[11655] Signal code: Address not mapped (1)
[11655] Failing at address: 0x10
[11655] [ 0] /usr/lib/libpthread.so.0(+0x11940)[0x7fe42b159940]
[11655] [ 1] /usr/lib/openmpi/openmpi/mca_btl_vader.so(mca_btl_vader_alloc+0xde)[0x7fe41e94717e]
[11655] [ 2] /usr/lib/openmpi/openmpi/mca_btl_vader.so(mca_btl_vader_sendi+0x22d)[0x7fe41e949c5d]
[11655] [ 3] /usr/lib/openmpi/openmpi/mca_pml_ob1.so(+0x806f)[0x7fe41e30806f]
[11655] [ 4] /usr/lib/openmpi/openmpi/mca_pml_ob1.so(mca_pml_ob1_send+0x3d9)[0x7fe41e308f29]
[11655] [ 5] /usr/lib/openmpi/libmpi.so.12(MPI_Send+0x11c)[0x7fe42b3df1cc]
[11655] [ 6] project[0x400e41]
[11655] [ 7] project[0x401429]
[11655] [ 8] project[0x400cdc]
[11655] [ 9] /usr/lib/libc.so.6(__libc_start_main+0xea)[0x7fe42adc343a]
[11655] [10] project[0x400b3a]
[11655] *** End of error message ***
[11670] *** …Run Code Online (Sandbox Code Playgroud) 当我尝试使用此命令运行 c 文件时mpirun \xe2\x80\x93np 2 ./ hellow\nit 返回[proxy:0:0@suganthan-VirtualBox] HYDU_create_process (utils/launch/launch.c:74): execvp error on file ./ (Permission denied).\n我无法解决此错误。谁能建议任何方法来解决它?
我编写了一个简单的测试程序来比较使用 MPI 并行化多个进程的性能,或者使用std::thread. 并行化的工作只是写入一个大数组。我看到的是,多进程 MPI 的性能远远优于多线程。
测试代码为:
#ifdef USE_MPI
#include <mpi.h>
#else
#include <thread>
#endif
#include <iostream>
#include <vector>
void dowork(int i){
int n = 1000000000;
std::vector<int> foo(n, -1);
}
int main(int argc, char *argv[]){
int npar = 1;
#ifdef USE_MPI
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &npar);
#else
npar = 8;
if(argc > 1){
npar = atoi(argv[1]);
}
#endif
std::cout << "npar = " << npar << std::endl;
int i;
#ifdef USE_MPI
MPI_Comm_rank(MPI_COMM_WORLD, &i);
dowork(i);
MPI_Finalize();
#else
std::vector<std::thread> threads;
for(i …Run Code Online (Sandbox Code Playgroud) 我是 DPC++ 的新手,我尝试开发一个基于 MPI 的 DPC++ 泊松解算器。我读了这本书,对缓冲区和指针与共享或主机内存感到非常困惑。这两件事有什么区别,我开发代码时应该使用什么。
现在,我使用由具有 const 大小的 std::array 初始化的缓冲区作为串行代码,并且效果良好。然而,当我将 DPC++ 代码与 MPI 耦合时,我必须为每个设备声明本地长度,但我没有这样做。这里我附上我的代码
define nx 359
define ny 359
constexpr int local_len[2];
global_len[0] = nx + 1;
global_len[1] = ny + 1;
for (int i = 1; i < process; i++)
{
if (process % i == 0)
{
px = i;
py = process / i;
config_e = 1. / (2. * (global_len[1] * (px - 1) / py + global_len[0] * (py - 1) / …Run Code Online (Sandbox Code Playgroud) 我需要编写一个C函数来计算n个输入的最小值,并在数组中按升序插入它们.输入没什么特别之处.所有正数和<100.棘手的部分是结果来自阻塞MPI_Recv(),输出不仅要计算n个输入的当前最小值,还需要跟踪已经插入的值结果数组,以便它们可以作为未来n个输入组的考虑因素.
简而言之,MPI master将masterArray(填充随机整数)拆分为subArrays.从属服务器对subArrays进行排序并将其返回给主服务器.然后,master必须将已排序的subArrays拼接回一个已排序的finalArray(除非我可以重用masterArray).主机获取n个subArrays,取决于从机的数量,需要选择,比如第一次,n个数组中n个值中的最小值,然后需要将指针前进到从中挑选的数组,所以该价值将不再被考虑.这需要做,直到所有值按升序传输到finalArray.
我存储已排序的subArrays的方式,因为它们来自master的Recv,是memcpy()临时数组的每个chunkSize元素,其中chunkSize = ARRAY_SIZE /(nprocs-1)到我调用的1D数组,semiSortedArrays.
首先,我不太确定如何定义一个接受n值的函数.我无法跟踪所有指针以及如何将n个参数传递给函数调用.我真的很感激一些帮助,因为我很困惑.
非常感谢,斯科特
mpi ×5
c ×2
c++ ×2
arrays ×1
dpc++ ×1
intel-oneapi ×1
openmpi ×1
performance ×1
sorting ×1
sycl ×1