英特尔i7上的OpenMP

时间:2009-08-27 13:10:57

标签: openmp

我在i7 CPU中遇到openMP问题。

我使用openMP只是为了并行'for'循环。算法被用在几个不同的PC上并且没有任何问题地工作。最近,我们试图在i7系统上运行它,我们遇到了问题。软件通常会运行一段时间,在几个周期之后它会报告“内存不足”而我们试图找到内存泄漏,但我们发现软件使用的堆栈大小太大了 - 有很多1Mb线程没有关闭。以某种方式,openMP创建的线程都被卡在堆栈中,内存充满了它们。

有没有人经历过这样的行为?代码很简单,只是一个 'pragma omp parallel for' 有一些循环,在其他PC上运行正常。

我正在使用带有内置openMP库的Microsoft Visual C ++ 9.0编译器。

谢谢 谢尔盖

4 个答案:

答案 0 :(得分:2)

谢谢你的回答。我发现当OpenMP启动一些并行循环时,它会打开几个线程,这些线程不会在最后停止,而是在另一个并行循环上重用。在i7的情况下,它们不会被重用,但总是为每个并行循环创建一个新的,因此有稳定的1Mb堆栈增长。

我还尝试编写一个非常简单的应用程序,它只使用openMP来并行化几个循环,我没有在i7上发现它有任何问题。在主软件中看起来有一些条件允许并行化这样的问题。试图找到更多...

答案 1 :(得分:0)

您可以尝试使用英特尔线程构建模块库(TBB),它与OpenMP非常相似,并且更容易以您描述的方式并行化for循环 - 以查看是否存在任何差异。

答案 2 :(得分:0)

这听起来像操作系统问题而不是应用程序问题。我假设编译器为相同的代码生成相同的程序集。如果您有一些旧的超线程CPU,您可以尝试使用您的代码,看看是否会出现同样的问题。

答案 3 :(得分:0)

因为我看不到你的代码我会试着猜...

对我来说,使用#pragma omp时,听起来有点像嵌套循环的问题。

如果你有嵌套循环,你必须将内部循环的计数器变量设置为私有。

看一下这个样本:

#pragma omp for private(j)
for(i=0; i<100; i++)
{
    for(j=0; j<10; j++)
    {
       A[i] = A[i] * 2;
    }
}

变量j设置为private以在每个线程中拥有它的实例,而不是所有线程的相同实例。

在你的代码中检查一下,也许这就是问题所在。

并且(你的编译器应该告诉你)不要使用break;在你的并行循环中。那不行。

祝你好运!