标签: openmp

最新版本的GCC(4.6)如何在Mac OS下与Qt一起使用?

我的问题与这里讨论的问题有关:

有没有办法让OpenMP可以在Qt跨越线程上运行?

试图在Mac OS下运行我的基于Qt的程序,在辅助线程中有一个OpenMP子句时,它崩溃了.浏览完网页后,现在我明白这是由Apple提供的gcc旧版本(4.2)中的一个错误引起的.

然后我从http://hpc.sourceforge.net下载了最新的4.6版gcc 并尝试编译该项目,但是我从g ++编译器得到了以下错误:

无法识别的选项'-arch'无法识别的选项'-Xarch_x86_64'

我了解到这是因为这些是选项,只能由自定义配置的Apple-gcc编译器解释,而不能由标准gcc解释.

任何人都可以帮助我,我可以克服这个问题并配置g ++ 4.6与Qt一起使用以获得无错误的OpenMP支持吗?我承认我在Mac OS平台上是关于编译器和编程的新手,并希望从Visual Studio-Qt环境中移植我的代码.

提前谢谢了!

macos qt gcc openmp

9
推荐指数
1
解决办法
2659
查看次数

指针是否在OpenMP并行部分中是私有的?

我已经将OpenMP添加到现有代码库中,以便并行化for循环.在parallel for区域范围内创建了几个变量,包括一个指针:

#pragma omp parallel for
for (int i = 0; i < n; i++){
    [....]
    Model *lm;
    lm->myfunc();
    lm->anotherfunc();
    [....]
}
Run Code Online (Sandbox Code Playgroud)

在结果输出文件中,我注意到不一致,可能是由竞争条件引起的.我最终通过使用一个解决了竞争条件omp critical.我的问题仍然存在:lm每个线程都是私有的,还是共享的?

c++ parallel-processing multithreading openmp

9
推荐指数
1
解决办法
3551
查看次数

迭代与Cython并行的列表

如何在Cython中的(Python)列表上并行迭代?

考虑以下简单功能:

def sumList():
    cdef int n = 1000
    cdef int sum = 0

    ls = [i for i in range(n)]

    cdef Py_ssize_t i
    for i in prange(n, nogil=True):
        sum += ls[i]

    return sum
Run Code Online (Sandbox Code Playgroud)

这会产生很多编译器错误,因为没有GIL的并行部分显然无法与任何Python对象一起使用:

Error compiling Cython file:
------------------------------------------------------------
...

    ls = [i for i in range(n)]

    cdef Py_ssize_t i
    for i in prange(n, nogil=True):
        sum += ls[i]
     ^
------------------------------------------------------------

src/parallel.pyx:42:6: Coercion from Python not allowed without the GIL

Error compiling Cython file:
------------------------------------------------------------
...

    ls = [i for …
Run Code Online (Sandbox Code Playgroud)

python parallel-processing openmp cython

9
推荐指数
1
解决办法
7382
查看次数

std :: atomic可以安全地与OpenMP一起使用

我目前正在努力学习使用OpenMP,我有一个问题.做这样的事情是否安全:

  std::atomic<double> result;
  #pragma omp parallel for
  for(...)
  {
  result+= //some stuff;
  }
Run Code Online (Sandbox Code Playgroud)

或者我应该使用:

  double result;
  #pragma omp parallel for
  for(...)
  {
    double tmp=0;
    //some stuff;
    #pragma omp atomic
    result+=tmp;
  }
Run Code Online (Sandbox Code Playgroud)

谢谢 !

编辑:我知道处理的最简单的方法是使用数组,但我问,因为我很好奇

c++ atomic openmp c++11 stdatomic

9
推荐指数
1
解决办法
883
查看次数

并行循环内的Matlab引擎

我在一段并行代码中使用多个matlab引擎时遇到了一些麻烦.我可以使用多个引擎成功生成多个引擎,engOpenSingleUse但无法与多个引擎通信(即调用engPutVariable失败).

与往常一样,最小(VS)示例:

#include "stdafx.h"
#include <engine.h>
#include <omp.h>

int _tmain(int argc, _TCHAR* argv[])
{
//First spawn the matlab engine sessions
Engine *m_Engines[2];
for (int i = 0; i < 2; i++)
{
    m_Engines[i] = engOpenSingleUse(NULL, NULL, NULL);
}

//Then spawn the worker threads...
#pragma omp parallel num_threads(2)
{   
    // Allocate an engine to each thread
    int thread_num = omp_get_thread_num();
    Engine *thisEngine = m_Engines[thread_num];

    #pragma omp for
    for (int i = 0; i < 10000; i++)
    { …
Run Code Online (Sandbox Code Playgroud)

c++ matlab openmp matlab-engine

9
推荐指数
1
解决办法
482
查看次数

OMP部分中的线程数

我的电脑有四个核心.我正在运行Ubuntu 15.10,并使用g ++ -fopenmp编译...

我有两种不同类型的工作,两者都是相互独立的:Work1和Work2.特别是,Work1应该在单个处理器上运行,但Work2应该并行化.我尝试使用omp_set_num_threads():

#pragma omp parallel sections
{
    #pragma omp section
    {
        // Should run on one processor.
        omp_set_num_threads(1);
        Work1();
    }

    #pragma omp section
    {
        // Should run on as many processors as possible.
        omp_set_num_threads(3);
        Work2();
    }
}
Run Code Online (Sandbox Code Playgroud)

说Work2是这样的:

void Work2(...){
    #pragma omp parallel for
    for (...) ...

    return;
}
Run Code Online (Sandbox Code Playgroud)

程序运行时,只使用两个处理器.显然omp_set_num_threads()没有像我预期的那样工作.有没有什么可以使用OpenMP来解决这种情况?

谢谢大家,

罗德里戈

c++ multithreading openmp

9
推荐指数
1
解决办法
5762
查看次数

在El Capitan的Xcode中的clang-omp

我喜欢在使用Xcode作为IDE的c ++项目中使用openmp.不幸的是,Apple的Clang编译器不支持openmp(见这里),所以我安装了clang-omp.我完全按照该网站上的说明在Xcode中使用它,但我收到错误消息can't exec '/usr/local/bin/clang++-omp' (No such file or directory).我尝试编译通过终端在他们的网站上给出的简单示例,当我通过编译它时我得到了它clang-omp++ -fopenmp file.cpp.对我来说,看起来Xcode应该搜索/usr/local/bin/clang-omp++(与之形成对比/usr/local/bin/clang++-omp).按照评论中的建议制作符号链接后,我收到另一条错误消息:library not found for -liomp5.我怎样才能解决这个问题?

c++ openmp xcode7

9
推荐指数
1
解决办法
1万
查看次数

为什么C++乘法与动态数组比std :: vector版更好

我正在为具有不同数据结构和技术(向量,数组和OpenMP)的矩阵实现C++乘法,我发现了一个奇怪的情况......我的动态数组版本运行得更好:

时间:

openmp mult_1:time:5.882000 s

array mult_2:time:1.478000 s

我的编译标志是:

/ usr/bin/g ++ -fopenmp -pthread -std = c ++ 1y -O3

C++矢量版

typedef std::vector<std::vector<float>> matrix_f;
void mult_1 (const matrix_f &  matrixOne, const matrix_f & matrixTwo, matrix_f & result) {
    const int matrixSize = (int)result.size();
    #pragma omp parallel for simd
    for (int rowResult = 0; rowResult < matrixSize; ++rowResult) {
        for (int colResult = 0; colResult < matrixSize; ++colResult) {
            for (int k = 0; k < matrixSize; ++k) {
                result[rowResult][colResult] += …
Run Code Online (Sandbox Code Playgroud)

c++ arrays matrix openmp c++11

9
推荐指数
1
解决办法
773
查看次数

pragma omp并行与pragma omp并行

在使用openMP的C++中,是否有任何区别

#pragma omp parallel for
for(int i=0; i<N; i++) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

#pragma omp parallel
for(int i=0; i<N; i++) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

c++ openmp

9
推荐指数
1
解决办法
5159
查看次数

MacOS,CMake和OpenMP

我使用Homebrew的最新CMake(3.9.3)以及Brew的LLVM 5.0.0,因为Clang在这里有OpenMP支持.

这适用于CMake 3.8.2和LLVM 5.


在我的CMakeLists.txt

find_package( OpenMP )
Run Code Online (Sandbox Code Playgroud)

后来我想做

if( OpenMP_CXX_FOUND )
Run Code Online (Sandbox Code Playgroud)

然而,CMake似乎没有接受该find_package指令.

我用CMake运行

cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DUSE_WERROR=ON
Run Code Online (Sandbox Code Playgroud)

我已经检查过clangclang++正确指向/usr/local/opt/llvm/bin/clang/usr/local/opt/llvm/bin/clang++

我得到的只是这两行:

-- Could NOT find OpenMP_C (missing: OpenMP_C_FLAGS OpenMP_C_LIB_NAMES) (found version "1.0")
-- Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES) (found version "1.0")
Run Code Online (Sandbox Code Playgroud)

如果我OpenMP_C_FLAGS自己设置(带-DOpenMP_C_FLAGS=-fopenmp=libomp)它会将错误更改为

-- Could NOT find OpenMP_C (missing: OpenMP_C_LIB_NAMES) (found version "3.1")
Run Code Online (Sandbox Code Playgroud)

请注意,它会更改版本号,因此必须找到一些东西,对吗?

我错过了什么才能正常工作?


好吧,似乎在FindOpenMP.cmakeCMake提供的内部我们做了一个try_compile,它默默地失败了(因为我们做了很多次,而且大多数都会失败,这是有道理的).但是,使用Clang时-Werror会提供一个标志,该标志由于未使用的命令行参数而失败.我可以这样补充: …

cmake openmp

9
推荐指数
3
解决办法
8808
查看次数