Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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 在OpenMP中,在并行区域内调用exit()是一种不好的做法吗?_C_Multithreading_Openmp - Fatal编程技术网

C 在OpenMP中,在并行区域内调用exit()是一种不好的做法吗?

C 在OpenMP中,在并行区域内调用exit()是一种不好的做法吗?,c,multithreading,openmp,C,Multithreading,Openmp,我有一个同时使用MPI和OpenMP的程序 主人生了几个奴隶。 每个从机都使用OpenMP进行多线程处理,一个线程专用于通信(MPI_线程\u漏斗状) 当通信线程收到来自主线程的消息,指示进程必须停止时,我不想等待并行区域内的所有线程完成 所以现在我在并行区域内调用exit()函数,但我想知道这是否是一种不好的做法,是否有更优雅的方法来退出并行区域内的进程?从操作系统的角度来看是安全的。当您退出进程时,操作系统关闭所有句柄、终止线程并释放所有相关内存。现代操作系统必须这样做,因为进程可能会在无意

我有一个同时使用MPI和OpenMP的程序

主人生了几个奴隶。 每个从机都使用OpenMP进行多线程处理,一个线程专用于通信(MPI_线程\u漏斗状)

当通信线程收到来自主线程的消息,指示进程必须停止时,我不想等待并行区域内的所有线程完成


所以现在我在并行区域内调用exit()函数,但我想知道这是否是一种不好的做法,是否有更优雅的方法来退出并行区域内的进程?

从操作系统的角度来看是安全的。当您退出进程时,操作系统关闭所有句柄、终止线程并释放所有相关内存。现代操作系统必须这样做,因为进程可能会在无意中退出,并且不会影响系统的稳定性


但从应用程序的角度来看,这一切都要视情况而定。你的应用程序能否以脏状态退出?如果您错过了磁盘写入,它会损坏您的数据文件吗?如果您不发送一个数据包,它将是事务干净的,那么所有内容是否仍保持同步?这完全取决于你的应用程序在做什么。

从操作系统的角度来看,这是安全的。当您退出进程时,操作系统关闭所有句柄、终止线程并释放所有相关内存。现代操作系统必须这样做,因为进程可能会在无意中退出,并且不会影响系统的稳定性


但从应用程序的角度来看,这一切都要视情况而定。你的应用程序能否以脏状态退出?如果您错过了磁盘写入,它会损坏您的数据文件吗?如果您不发送一个数据包,它将是事务干净的,那么所有内容是否仍保持同步?这完全取决于你的应用程序在做什么。

从操作系统的角度来看,这是安全的。当您退出进程时,操作系统关闭所有句柄、终止线程并释放所有相关内存。现代操作系统必须这样做,因为进程可能会在无意中退出,并且不会影响系统的稳定性


但从应用程序的角度来看,这一切都要视情况而定。你的应用程序能否以脏状态退出?如果您错过了磁盘写入,它会损坏您的数据文件吗?如果您不发送一个数据包,它将是事务干净的,那么所有内容是否仍保持同步?这完全取决于你的应用程序在做什么。

从操作系统的角度来看,这是安全的。当您退出进程时,操作系统关闭所有句柄、终止线程并释放所有相关内存。现代操作系统必须这样做,因为进程可能会在无意中退出,并且不会影响系统的稳定性

但从应用程序的角度来看,这一切都要视情况而定。你的应用程序能否以脏状态退出?如果您错过了磁盘写入,它会损坏您的数据文件吗?如果您不发送一个数据包,它将是事务干净的,那么所有内容是否仍保持同步?这取决于你的应用程序在做什么。

Summary 这是有效的OpenMP,但不正确的MPI

OpenMP 从OpenMP 4.0的第3页:

对于C/C++,一个可执行语句,可能是复合语句,带有一个 顶部入口和底部单个出口,或OpenMP 构造

在结构化块中允许调用exit()

MPI 从MPI 3.1的第357页(定义MPI\u Finalize):

此例程清除所有MPI状态。如果MPI程序正常终止(即,不是由于调用MPI_中止或不可恢复的错误),则每个进程必须在退出前调用MPI_FINALIZE

实际后果 在实践中,违反MPI标准的这一部分通常会产生最小的不良后果。但是,不调用
MPI\u Finalize
可能会导致某些实现中的资源泄漏,这些泄漏可能最终累积起来,使系统中的节点在重新启动之前无法使用

由于
MPI\u Finalize
是集体的,因此不能像
exit
那样使用它,尽管理论上可以使用
MPI\u Abort
在本地退出。但是,这可能会破坏整个MPI环境,因为许多实现对故障的本地化并不严格,即使
MPI\u Abort
被称为
MPI\u Abort(MPI\u COMM\u SELF,0)

摘要 这是有效的OpenMP,但不正确的MPI

OpenMP 从OpenMP 4.0的第3页:

对于C/C++,一个可执行语句,可能是复合语句,带有一个 顶部入口和底部单个出口,或OpenMP 构造

在结构化块中允许调用exit()

MPI 从MPI 3.1的第357页(定义MPI\u Finalize):

此例程清除所有MPI状态。如果MPI程序正常终止(即,不是由于调用MPI_中止或不可恢复的错误),则每个进程必须在退出前调用MPI_FINALIZE

实际后果 在实践中,违反MPI标准的这一部分通常会产生最小的不良后果。但是,不调用
MPI\u Finalize
可能会导致某些实现中的资源泄漏,这些泄漏可能最终累积起来,使系统中的节点在重新启动之前无法使用

由于
MPI\u Finalize
是集体的,因此不能像
exit
那样使用它,尽管理论上可以使用
MPI\u Abort
在本地退出。但是,这可能会破坏整个MPI环境,因为许多实现对故障的本地化并不严格,即使
MPI\u Abort
被称为
MPI\u Abort(MPI\u COMM\u SELF,0)

摘要 这是有效的OpenMP,但不正确的MPI

OpenMP 从OpenMP 4.0的第3页:

对于C/C++,一个可执行语句,可能是复合语句,带有一个 顶部入口和底部单个出口,或OpenMP 构造

在结构化块中允许调用exit()

MPI