【问题标题】:How to set openMP for Multithreading in ubuntu 12.04 for an openCV project?如何在 ubuntu 12.04 中为 openCV 项目设置多线程的 openMP?
【发布时间】:2014-03-09 18:24:02
【问题描述】:

我想使用#pragma omp parallel 在我的for loop 之一中进行多线程处理。所以,我正在编写以下代码:

#pragma omp parallel for 
for(int i=0; i<square->total; i++)
{
......
}

我的项目有一个 CMakeList.txt 和 Makefile。 我不明白,如何告诉编译器和链接器使用 openMP?

更新:

我用以下代码编辑了我的CMakeList.txt

find_package(OpenMP)
if (OPENMP_FOUND)
    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif()

然后我做了cmake .. 并在终端得到以下结果:

-- C 编译器标识为 GNU

-- CXX 编译器标识为 GNU

-- 检查工作的 C 编译器:/usr/bin/gcc

-- 检查工作的 C 编译器:/usr/bin/gcc -- 工作

-- 检测 C 编译器 ABI 信息

-- 检测 C 编译器 ABI 信息 - 完成

-- 检查工作的 CXX 编译器:/usr/bin/c++

-- 检查工作的 CXX 编译器:/usr/bin/c++ -- 工作

-- 检测 CXX 编译器 ABI 信息

-- 检测 CXX 编译器 ABI 信息 - 完成

-- 尝试 OpenMP C 标志 = [-fopenmp]

-- 执行测试 OpenMP_FLAG_DETECTED

-- 执行测试 OpenMP_FLAG_DETECTED - 成功

-- 尝试 OpenMP CXX 标志 = [-fopenmp]

-- 执行测试 OpenMP_FLAG_DETECTED

-- 执行测试 OpenMP_FLAG_DETECTED - 成功

-- 找到 OpenMP:-fopenmp

-- 配置完成

-- 生成完成

【问题讨论】:

  • 你少了一个for
  • 哪个“为”,在哪里?
  • #pragma omp parallel for for(int i=0; i&lt;square-&gt;total; i++)
  • 是的,我试过了……但同样的错误是“我没有在这个范围内声明”……但是如果我删除这个“pragma”的东西,那么程序就会运行
  • OP,如果我在下面的答案尝试没有帮助,请给我们一个完整但简单的示例(带有 main() 和 #includes 以及(简单)循环体),包括您如何正在尝试编译。

标签: c++ multithreading ubuntu gcc


【解决方案1】:

#pragma ... 应该单独一行。

#pragma omp parallel for
for(int i=0; i<square->total; i++)
{
......
}

确保不要忘记#pragma 末尾的for

首先确保它适用于注释掉的 #pragma 行,然后添加该行应该没问题(假设循环内的所有内容都可以并行化,没有并发问题或其他问题)。

还要确保将-fopenmp 传递给编译器和链接器,并且顶部有#include &lt;omp.h&gt;

【讨论】:

  • 谢谢...如何将-fopenmp 传递给comlier 和链接器?我的项目有 CMakeList.txt 和 Makefile...在添加了您提到的行之后,我只是做了make 并运行了我的程序...它没有给出任何错误,但计算时间没有改善跨度>
  • 我更新了我的问题,增加了一些使用 openMP 的步骤。
【解决方案2】:

@user2440724

我按照你的要求写了代码示例:

#include <string>
#include <iostream>
#include <vector>
#include <omp.h>
using namespace std;
using namespace cv;
//----------------------------------------------------------
// MAIN
//----------------------------------------------------------
int main(int argc, char* argv[])
{
#ifdef _OPENMP 
#pragma omp parallel for
#endif
    for (int i = 0; i < 10; i++)
    {
      std::cout << "A" << std::endl;    
    }
    getchar();
    return 0;
}

在vs2010中你需要启用openmp,如下图:

这里有很好的 linux 教程:http://goulassoup.wordpress.com/2011/10/28/openmp-tutorial/ 和 GNU OpenMP 文档:http://gcc.gnu.org/onlinedocs/libgomp/index.html#toc_Top

【讨论】:

  • 嗨,正如我所提到的,我正在使用 ubuntu。我已经更新了我的问题,请看一下。
  • 我已经添加了 linux 教程的链接(如上所述,它已针对 ubuntu 进行了测试)。
  • 谢谢,但我仍然不明白如何使用 openMP 运行我的程序...我已经在我的 CMakeList.txt 中包含了所需的东西,并且我能够使用 make 构建我的项目。 .no 错误...但不知道如何告诉他们我想使用 openMP
  • 谢谢..我已经阅读了这两个链接,但我不知道如何设置标志-fopenmp
  • 你确定它不使用 OpenMP 吗?您可以检查系统支持的最大线程数尝试检查它: int MAX_THREADS = omp_get_max_threads();您还可以获得处理器数量: int N_PROC = omp_get_num_procs();
猜你喜欢
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 2013-09-01
  • 2017-07-07
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多