gpt4 book ai didi

c++ - OpenMP 不会利用所有内核?

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

我正在尝试使用 OpenMP 使一些代码并行化。

    omp_set_num_threads( 8 );
#pragma omp parallel
for (int i = 0; i < verSize; ++i)
{
#pragma omp single nowait
{
neighVec[i].index = i;
mesh.getBoxIntersecTets(mesh.vertexList->at(i), &neighVec[i]);
}
}

verSize 大概90k,getBoxIntersecTets 比较贵。所以我希望代码能够充分利用四核 cpu。但是CPU使用率只有25%左右。有什么想法吗?

我也尝试过使用 omp parallel 进行构造,但情况相同。

getBoxIntersecTets 使用 STL unordered_set、vector 和 deque,但我想 OpenMP 应该不知道它们,对吗?

谢谢。

最佳答案

首先,#pragma omp single 禁用并行执行,您绝对不希望这样。


试试这个:

#pragma omp parallel for private(tempVec)
for (int i = 0; i < verSize; ++i)
{
auto tempVec = neighVec[i];
tempVec.index = i;
mesh.getBoxIntersecTets(mesh.vertexList->at(i), &tempVec);
neighVec[i] = tempVec;
}

您的原始代码的问题是不同的线程正在使用数组的相邻元素。相邻的元素在内存中并排放置,这意味着它们可能共享一个缓存行。由于一次只有一个核心可以拥有一条高速缓存行,因此一次只能有一个核心完成工作。或者更糟的是,您的程序可能花费更多时间来转移缓存行的所有权,而不是实际工作。

通过引入一个临时变量,每个worker可以对一个独立的cache line进行操作,然后你只需要访问最后共享的cache line来存储结果。如果第一个参数是通过非常量引用传递的,您应该对第一个参数做同样的事情。

关于c++ - OpenMP 不会利用所有内核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7558965/

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