我想避免并行代码中的竞争条件.问题是我的类包含几个全局变量,让我们说一个x简单的变量,以及一个for我希望并行的循环.实际的代码还有一个方法,它接受一个类的指针,在本例中为自身,作为参数,访问更多的全局变量.因此,threadprivate.使用OpenMP 创建整个实例可能是有意义的.MWE是
#include <iostream>
#include <omp.h>
class lotswork {
public:
int x;
int f[10];
lotswork(int i = 0) { x = i; };
void addInt(int y) { x = x + y; }
void carryout(){
#pragma omp parallel for
for (int n = 0; n < 10; ++n) {
this->addInt(n);
f[n] = x;
}
for(int j=0;j<10;++j){
std::cout << " array at " << j << " = " << f[j] << std::endl;
}
std::cout …Run Code Online (Sandbox Code Playgroud) 我在它刚刚出现时就开始使用experimental::filesystem,并且建议我以任何一种方式链接到“我的程序构建”中的“stdc++fs使用”,但是如果我省略了额外的链接命令,我可能会破坏某些东西/做一些不必要的事情吗?target_link_libraries(MyTarget stdc++fs)CMake.
这个问题是三年前提出的,似乎假设链接stdc++fs是必要的。
编辑:编译器版本是g++-9 (Homebrew GCC 9.3.0_1) 9.3.0,CMake版本是3.16。
非常感谢!
在某些机器上,在所有内核上加载软件包会占用所有可用 RAM,从而导致错误 137 并且我的 R 会话被终止。在我的笔记本电脑 (Mac) 和 Linux 计算机上,它运行良好。在我想要运行它的 Linux 计算机上,它没有 32 核和 32 * 6GB RAM。系统管理员告诉我计算节点上的内存是有限的。然而,根据我在下面的编辑,我的记忆需求并没有超出任何想象。
我如何调试它并找出不同之处?我是这个parallel包的新手。
这是一个示例(假设该命令install.packages(c(“tidyverse”,”OpenMx”))已在 4.0.3 版的 R 中运行):
我还注意到,这似乎只适用于OpenMx和mixtools包。我mixtools从 MWE 中排除,因为OpenMx足以产生问题。tidyverse单独工作正常。
我尝试过的一种解决方法是不在集群上加载包,而只是.libPaths("~/R/x86_64-pc-linux-gnu-library/4.0/")在 of 的主体中进行评估 expr,clusterEvalQ并像OpenMx::vec在我的函数中一样使用命名空间命令,但这会产生相同的错误。所以我被卡住了,因为在三台机器中的两台上它运行良好,只是不在我应该使用的一台(计算节点)上。
.libPaths("~/R/x86_64-pc-linux-gnu-library/4.0/")
library(parallel)
num_cores <- detectCores()
cat("Number of cores found:")
print(num_cores)
working_mice <- makeCluster(num_cores)
clusterExport(working_mice, ls())
clusterEvalQ(working_mice, expr = {
library("OpenMx")
library("tidyverse")
})
Run Code Online (Sandbox Code Playgroud)
通过简单地加载包,它似乎消耗了所有可用的 RAM,从而导致错误 137。这是一个问题,因为我需要在每个可用内核中加载库,它们的功能正在执行任务。
随后,我正在使用DEoptim但加载包足以产生错误。 …
我正在使用 CMake 和 GNU 的并行算法以及以下代码片段CMakeLists.txt:
if (OPENMP_FOUND)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif().
Run Code Online (Sandbox Code Playgroud)
这会让下面的命令变得多余吗?
target_link_libraries(MyTarget OpenMP::OpenMP_CXX)?
Run Code Online (Sandbox Code Playgroud)
我试图在这里找到答案,但没有成功。使用命令打印上述变量的输出后message,我看到最后两个是空的。
-- OpenMP_CXX_FLAGS are: -fopenmp
-- OpenMP_C_FLAGS are: -Xclang -fopenmp
-- CMAKE_EXE_LINKER_FLAGS are:
-- OpenMP_EXE_LINKER_FLAGS are:
Run Code Online (Sandbox Code Playgroud)
我尝试在这里查找变量定义,但没有找到更多信息。一个小测试程序使用:
__gnu_parallel::for_each
Run Code Online (Sandbox Code Playgroud)
无论我是否包含以下内容,都会并行运行:
target_link_libraries(MyTarget OpenMP::OpenMP_CXX)
Run Code Online (Sandbox Code Playgroud)
这使我得出结论:没有必要。真的吗?
我的gcc是g++-9 (Homebrew GCC 9.3.0_1) 9.3.0.