【问题标题】:Add OpenMP support to mex file compile from C file with Visual Studio 2010将 OpenMP 支持添加到使用 Visual Studio 2010 从 C 文件编译的 mex 文件
【发布时间】:2014-05-26 17:43:42
【问题描述】:

我是并行编程的新手,遇到了 OpenMP 库的问题。我用简单的代码在 Visual Studio Win 32 控制台应用程序中对其进行了测试:

int main(){
omp_set_num_threads(2);
#pragma omp parallel
    { 
       int tid = omp_get_thread_num();
       long tmp;
       if(tid == 0){ for (int i = 0;i<10000;i++){ tmp = ((i*999)*90000)*((i*999)*90000) }
       if(tid == 1){ for (int i = 0;i<10000;i++){ tmp = ((i*999)*90000)*((i*999)*90000) }
    }
}

代码是并行运行的,如果我在没有 OpenMP 的情况下运行它,它的运行时间会延长 2 倍。 现在,在 MATLAB 中,我可以运行 .mex 文件,这些文件是编译后在 MATLAB 中运行的 C 文件,您需要在文件中为特定编译器添加 /openmp 编译标志。由于我在 Visual Studio 2010 中工作,因此需要修改的文件是 msvc100opts.bat,我在编译标志中添加了 /openmp。当我进行基准测试时,我得到了不好的结果并且它不稳定。我已经阅读了大量对我没有帮助的指南。如何在 MATLAB 的 .mex 文件中可靠地使用 OpenMP 指令?

【问题讨论】:

  • 您能否更具体地谈谈“不良结果”和“不稳定”?

标签: c++ c matlab openmp mex


【解决方案1】:

这是一个扩展评论,而不是一个答案,老实说,我不确定你真正的问题是什么......

您向我们展示的内容不是并行的。它可能表现得好像它是但它不是(不完全是)。您已经定义了一个 OpenMP 并行区域,因此块内的每一行

#pragma omp parallel
    { 
     ...
    }

由每个线程运行。现在,每个线程都会遇到if 语句并采取适当的行动,因此您可能会认为您的程序正在并行运行,您可能是对的,但您已经完成了并行化,而不是 OpenMP。

您省略了并行化工作共享指令,例如 for。对于 OpenMP 并行化,您必须编写类似的东西(我还没有检查过它的语法或语义):

#pragma omp parallel for
    { 
       for (int i = 0;i<10000;i++){ tmp = ((i*999)*90000)*((i*999)*90000) }
    }

注意:

  1. 我包含了一个工作共享指令for
  2. 使用 OpenMP,程序员(几乎)不需要关心线程 ID。正如您编写的那样,您的程序需要重写和重新编译才能使用两个以外的任意数量的线程。更糟糕的是,您已经完成了并行化的繁重工作;如果这就是您想要做的事情,请继续,但您几乎不需要 OpenMP。
  3. 在并行区域内完成的工作量很小。事实上,一个非常好的编译器可能会发现 tmp 没有在并行区域之外使用并优化整个循环。您将无法就并行程序的性能vs串行版本的性能得出任何有用的结论,即使在您解决了问题之后也是如此。

至于在 Windows 上使用 OpenMP 编译 MEX 文件的问题,我没有什么建议,但我会指出,即使是最新版本的 MS C 和 C++ 编译器,在 v2.0 之后也没有实现 OpenMP

【讨论】:

  • +1 感谢您分享您的知识,这对墨西哥问题没有帮助。
  • 我最喜欢的搜索引擎会为 openmp in mex files 找到大量结果,我希望你的也会如此。从您的问题来看,您的程序似乎可以使用 OpenMP 正确编译,但未按预期运行。如果编译不正确,请使用编译错误和警告增加您的问题。
  • 如果我能用我的搜索引擎解决这个问题,我不会在这里问。说“我最喜欢的搜索引擎出现大量结果”真的很容易......你认为我没有尝试过吗?
  • 哦,尖尖的,我受伤了。尽管您付出了很多努力,但似乎还是找不到一个正确的 OpenMP 示例来研究。试试software.intel.com/sites/products/documentation/studio/composer/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多