小编Hir*_*rek的帖子

声明自己(*this)私有的类以避免竞争条件/在gcc中放弃使用threadprivate

我想避免并行代码中的竞争条件.问题是我的类包含几个全局变量,让我们说一个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)

c++ gcc openmp

10
推荐指数
1
解决办法
336
查看次数

使用文件系统时仍然需要使用 C++20 链接到 stdc++fs 吗?

我在它刚刚出现时就开始使用experimental::filesystem,并且建议我以任何一种方式链接到“我的程序构建”中的“stdc++fs使用”,但是如果我省略了额外的链接命令,我可能会破坏某些东西/做一些不必要的事情吗?target_link_libraries(MyTarget stdc++fs)CMake.

这个问题是三年前提出的,似乎假设链接stdc++fs是必要的。

编辑:编译器版本是g++-9 (Homebrew GCC 9.3.0_1) 9.3.0CMake版本是3.16。

非常感谢!

c++ gcc std-filesystem

5
推荐指数
1
解决办法
7485
查看次数

R 的并行包加载库的 RAM 使用过多

在某些机器上,在所有内核上加载软件包会占用所有可用 RAM,从而导致错误 137 并且我的 R 会话被终止。在我的笔记本电脑 (Mac) 和 Linux 计算机上,它运行良好。在我想要运行它的 Linux 计算机上,它没有 32 核和 32 * 6GB RAM。系统管理员告诉我计算节点上的内存是有限的。然而,根据我在下面的编辑,我的记忆需求并没有超出任何想象。

我如何调试它并找出不同之处?我是这个parallel包的新手。

这是一个示例(假设该命令install.packages(c(“tidyverse”,”OpenMx”))已在 4.0.3 版的 R 中运行):

我还注意到,这似乎只适用于OpenMxmixtools包。我mixtools从 MWE 中排除,因为OpenMx足以产生问题。tidyverse单独工作正常。

我尝试过的一种解决方法是不在集群上加载包,而只是.libPaths("~/R/x86_64-pc-linux-gnu-library/4.0/")在 of 的主体中进行评估 exprclusterEvalQ并像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但加载包足以产生错误。 …

parallel-processing r

5
推荐指数
1
解决办法
140
查看次数

使用此 CMake 链接命令仍然需要针对 OpenMP::OpenMP_CXX 的显式链接吗?

我正在使用 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)

这使我得出结论:没有必要。真的吗?

我的gccg++-9 (Homebrew GCC 9.3.0_1) 9.3.0.

c++ gcc cmake openmp

2
推荐指数
1
解决办法
2317
查看次数

标签 统计

c++ ×3

gcc ×3

openmp ×2

cmake ×1

parallel-processing ×1

r ×1

std-filesystem ×1