gpt4 book ai didi

C++ 动态内存分配在 OpenMP 中较慢,即使对于非并行代码段也是如此

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:48 25 4
gpt4 key购买 nike

我在使用 OpenMP 时遇到了一个相当令人沮丧的问题:似乎如果 OpenMP 在代码中的某处以并行模式使用(对于多个线程),那么即使在非代码的并行部分。这是一个示例程序(只是一个例子):

int main()
{
#pragma omp parallel
{
// Just to get OpenMP going
}

double wtime0, wtime;
wtime0 = omp_get_wtime();

double **stuff;
const int N = 1000000;

stuff = new double*[N];
for (int i=0; i < N; i++) stuff[i] = new double;
for (int i=0; i < N; i++) *(stuff[i]) = sqrt(i);
for (int i=0; i < N; i++) delete[] stuff[i];
delete[] stuff;

wtime = omp_get_wtime() - wtime0;
cout << "Total CPU time: " << wtime << endl;
}

当我在笔记本电脑(Intel Core 2 Duo)上用一个线程运行这段代码时,我得到的 CPU 时间为 0.093。另一方面,如果我用两个线程运行它,CPU 时间增加到 0.13。指针分配越多,差异就越严重。在上面的代码中,如果我用一个简单的数组替换“stuff”,例如

    double stuff2[N];
for (int i=0; i < N; i++) stuff2[i] = sqrt(i);

那么就没有差异了。有人能告诉我为什么在分配/取消分配指针时存在这个问题,即使它不是并行完成的吗?这是一个问题的原因是因为在我使用的真实代码中,动态内存分配是必不可少的。有些部分可以通过并行运行来加速,但是(使用两个线程与一个线程相比)内存分配/取消分配显着减慢,即使在非并行部分也是如此。如果有丰富的 OpenMP 经验的人可以告诉我如何解决这个问题,我将不胜感激。 (最坏的情况,我可以改用 MPI,但如果这可以在 OpenMP 中解决,我会很高兴。)

在此先感谢您的帮助。

最佳答案

是的,这是可以想象的。通常,应该避免在多线程环境中进行简单的动态分配,因为那里只有一个锁。 MT 感知分配器提供了更好的性能,在分配繁重的场景中应该是首选。这就是为什么我总是对这里只使用 vector 或字符串或共享指针作为类成员而不让用户指定分配策略的代码皱眉。

关于C++ 动态内存分配在 OpenMP 中较慢,即使对于非并行代码段也是如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32206483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com