2

我在 i7 CPU 中遇到 openMP 问题。

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

有没有人经历过这样的行为?代码非常简单,只是一个带有一些循环的“pragma omp parallel for”,在其他 PC 上也可以正常工作。

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

谢谢谢尔盖

4

4 回答 4

3

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

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

于 2009-09-01T08:18:32.267 回答
0

由于我看不到您的代码,我会尝试猜测...

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

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

看看这个样本:

#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;在你的并行循环中。那是行不通的。

祝你好运!

于 2012-06-14T12:43:49.740 回答
0

您可以尝试使用 Intel Thread Building Blocks library (TBB),它与 ​​OpenMP 非常相似,并且以您描述的方式并行化 for 循环非常容易 - 看看是否有任何区别。

于 2009-08-31T00:33:30.487 回答
0

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

于 2009-08-31T00:40:09.507 回答