Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在多线程环境中使用序列化的MPI\U线程时,是否需要锁来执行所有MPI调用?_C++_Multithreading_Parallel Processing_Mpi - Fatal编程技术网

C++ 在多线程环境中使用序列化的MPI\U线程时,是否需要锁来执行所有MPI调用?

C++ 在多线程环境中使用序列化的MPI\U线程时,是否需要锁来执行所有MPI调用?,c++,multithreading,parallel-processing,mpi,C++,Multithreading,Parallel Processing,Mpi,在MPI多线程环境中,当我们使用序列化的MPI线程初始化MPI Init线程时,应该使用互斥锁(或其他线程锁机制)保护MPI调用(检查)。MPI_THREAD_MULTIPLE不需要此功能,但并非所有MPI实现都支持此功能 我的问题是,某些MPI函数是否绝对需要锁,特别是MPI\u Test、MPI\u Wait和MPI\u Get\u count。我知道所有“有通信”的MPI调用都需要锁(如MPI_聚集,MPI_广播,MPI_发送,MPI_接收,MPI_接收,MPI_Irecv等),但我怀疑其

在MPI多线程环境中,当我们使用序列化的MPI线程初始化MPI Init线程时,应该使用互斥锁(或其他线程锁机制)保护MPI调用(检查)。MPI_THREAD_MULTIPLE不需要此功能,但并非所有MPI实现都支持此功能

我的问题是,某些MPI函数是否绝对需要锁,特别是MPI\u TestMPI\u WaitMPI\u Get\u count。我知道所有“有通信”的MPI调用都需要锁(如MPI_聚集MPI_广播MPI_发送MPI_接收MPI_接收MPI_Irecv等),但我怀疑其他功能不需要锁,例如MPI\u Get\u count,这是一个本地函数。我需要知道像MPI\u TestMPI\u WaitMPI\u Get\u countMPI\u ProbeMPI\u Iprobe(我不知道其中哪些是本地函数,哪些不是)。这个锁依赖性是在MPI标准中定义的还是在实现中定义的

我正在开发一个并行化库,其中混合了C++11线程的非阻塞MPI调用,我需要使用MPI_THREAD_SERIALIZED来支持大多数MPI实现MPI\u线程\u多个也在库中实现(在大多数情况下性能更好),但还需要对MPI\u线程序列化的支持

在下一个简单的示例代码中,在调用MPI\u测试之前是否需要锁

#包括
#包括
#包括
#包括
#包括
静态std::互斥互斥;
常量static int numThreads=4;
静态整数秩;
静态int NPROC;
静态无效rthread(常量整数){
int recv_buff[2];
int send_buff[2];
MPI_请求recv_请求;
{
std::lock_guard lck(mutex);//0)?秩1:nprocs-1)、第三、MPI_COMM_WORLD和recv_请求);
}
发送_buff[0]=第三次;
send_buff[1]=等级;
{

std::lock_guard lck(互斥);//需要锁。标准仅简要说明:

MPI\u线程\u序列化
该进程可能是多线程的,并且是多线程的 线程可以进行MPI调用,但一次只能调用一个:MPI调用不可用 由两个不同的线程同时生成


因此,对不同类型的MPI函数的调用没有区别。因为您的目标是编写可移植代码-否则您可以假设一个具有
MPI\u线程\u多个
-的实现-您必须遵守标准。

“我在MPI\u测试和MPI\u Get\u计数调用中执行了一些没有锁的代码,没有发生什么不好的事情。”-仅仅因为您的测试中没有发生任何不好的事情并不意味着将来其他用户的机器上也不会发生任何不好的事情。竞争条件非常恶劣,任何时候都可能发生。此外,未来的用户可能会在不同的硬件上运行您的代码,除非您严格遵守标准中规定的保证,否则您不知道结果如何你会得到“在我的机器上工作”没有任何意义。是的,详细阅读MPI标准并没有说明任何其他内容。似乎MPI调用可能会使用内部线程不安全的函数,因此有必要对它们进行序列化。也许我们可以检查特定MPI实现中的某个MPI调用是否只使用内部线程安全的函数,但这将d不符合MPI标准,甚至可能与此特定MPI实现的未来更新不兼容。结论是有必要对所有MPI调用执行锁定,包括本地调用,如MPI_Get_count或MPI_Cancel。