编译openmp,macports gcc和eclipse cdt

时间:2013-12-10 08:49:50

标签: openmp

我是openmp的新手。以下是环境。

操作系统:Mac OSX Mavericks
编译器:gcc(MacPorts gcc48 4.8.2_0)4.8.2
IDE:Eclipse Kepler CDT插件

我写了以下openmp程序

#include < stdio.h>  
#include < omp.h>  

int main()  
{
#pragma omp parallel
{
    int i=omp_get_thread_num();
    printf("hello (%d)",i);
    printf("world (%d)",i);
  }
}

我编译了上面的程序并得到错误,找不到omp.h并找不到lgomp。因此,我在项目属性中添加了一个包含路径,其中包含/opt/local/lib/gcc48/gcc/x86_64-apple-darwin13/4.8.2/include和一个库路径/ opt / local / lib / gcc48。 include路径有omp.h文件,库路径有libomp.o文件。

我通过项目属性在链接器和编译器选项中包含-fopenmp选项。它正在使用gcc -I / opt / local / lib / gcc48 / gcc / x86_64-apple-darwin13 / 4.8.2 / include -O0 -g3 -Wall -c -fmessage-length = 0 -fopenmp -MMD -MP进行编译 - MF“src / OpenMPCourseExamples.d”-MT“src / OpenMPCourseExamples.d”-o“src / OpenMPCourseExamples.o”“../src/OpenMPCourseExamples.c”并使用命令“gcc -L / opt / local /进行链接lib / gcc48 -fopenmp -o“OpenMPCourseExamples”./ src / OpenMPCourseExamples.o“。

使用上面的命令,它编译时没有错误但有警告 - “警告:未知的编译指示被忽略[-Wunknown-pragmas] #pragma omp parallel”。

另外,我在启动属性中设置了一个环境变量,其中OMP_NUM_THREADS = 4。我运行了使用上述警告编译的程序。我只得到“你好(0)世界(0)”。我的印象是我应该开始四个线程并且应该在某些顺序中看到“hello(1)world(1)hello(2)world(2)hello(3)world(3)”的其他输出。现在,这是我的以下问题。

  1. 为什么我收到#pragma警告?
  2. 编译器是否真的检测到openmp并使用openmp进行构建?
  3. 如果一切正确,为什么我没有看到四个不同的线程开始?

2 个答案:

答案 0 :(得分:2)

最好的步骤适用于openmp,macports gcc编译器,mac osx mavericks中的eclipse CDT。

  1. 在Eclipse中启用“Make ToolChain(s)Preferred” - > Preference-&gt; C / C ++ - &gt; New C / C ++ Project Wizard。
  2. sudo port select --list gcc并设置它sudo port select --set gcc with mp-gcc。
  3. 文件 - &gt;新项目 - &gt; C项目(不是C ++)并创建一个hello world项目。
  4. 在项目 - >属性 - &gt; C / C ++构建 - >设置 - &gt;工具设置中设置以下内容。 (a)GCC C编译器到/opt/local/bin/gcc-mp-4.8(b)MAC OSX链接器到/opt/local/bin/gcc-mp-4.8
  5. 构建hello world项目并确保它编译并成功运行。
  6. 包含open mp代码。代码在本页的问题中提出。
  7. 再次转到项目 - >属性 - &gt; C / C ++构建 - >设置 - &gt;工具设置设置如下。 (a)GCC编译器 - &gt;其他添加-fopenmp(b)MacOSx Linker-&gt;杂项设置-fopenmp
  8. 再次构建代码。
  9. 上述步骤对我有用。

答案 1 :(得分:1)

MacPorts使用--program-suffix=-mp-${major}配置GCC构建过程,因此所有编译器可执行文件都具有-mp-4.8后缀。当您致电gcc时,您最终使用Apple的Clang编译器,该编译器不支持OpenMP,因此无法识别-fopenmp选项和#pragma omp ...

您必须对项目设置进行以下更改:

  1. 将编译器命令更改为gcc-mp-4.8
  2. 将链接器命令更改为gcc-mp-4.8
  3. 删除包含和库路径的显式规范,因为-fopenmp的存在会自动添加它们。