我的问题与这里讨论的问题有关:
试图在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环境中移植我的代码.
提前谢谢了!
我已经将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每个线程都是私有的,还是共享的?
如何在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) 我目前正在努力学习使用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)
谢谢 !
编辑:我知道处理的最简单的方法是使用数组,但我问,因为我很好奇
我在一段并行代码中使用多个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) 我的电脑有四个核心.我正在运行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来解决这种情况?
谢谢大家,
罗德里戈
我喜欢在使用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.我怎样才能解决这个问题?
我正在为具有不同数据结构和技术(向量,数组和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) 在使用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)
?
谢谢!
我使用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)
我已经检查过clang并clang++正确指向/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会提供一个标志,该标志由于未使用的命令行参数而失败.我可以这样补充: …