【发布时间】:2021-06-07 10:30:01
【问题描述】:
我的代码如下所示:
void SimulationStep ( float *In, float *Out, float L, int N)
{
Out[0] = In[0] - 2.0f*L*In[0] + L*In[N-1] + L*In[1];
for (int x=1; x<N-1; x++)
{
Out[x] = In[x] - 2.0f*L*In[x] + L*In[x-1] + L*In[x+1];
}
Out[N-1] = In[N-1] - 2.0f*L*In[N-1] + L*In[N-2] + L*In[0];
}
我正在尝试并行化它。我已经尝试了很多东西,这就是一个例子:
void SimulationStep ( float *In, float *Out, float L, int N)
{
Out[0] = In[0] - 2.0f*L*In[0] + L*In[N-1] + L*In[1];
#pragma omp parallel for
for (int x=1; x<N-1; x++)
{
Out[x] = In[x] - 2.0f*L*In[x] + L*In[x-1] + L*In[x+1];
}
Out[N-1] = In[N-1] - 2.0f*L*In[N-1] + L*In[N-2] + L*In[0];
}
我应用的更改只增加了 0.5 秒,从 14 秒到 13.5 秒,所以我怀疑代码确实没有并行化。我认为这可能是内存受限的瓶颈,所以我不知道该怎么办。先感谢您。 Ps:我正在用 gcc/9.2.0 和 -03 -fopenmp 编译。
【问题讨论】:
-
您可以通过例如在循环内打印线程 ID (
omp_get_thread_num()) 轻松找出它是否并行运行。由于内存瓶颈(内存受限),您可能是正确的。N有多大? -
N= 10000000。如果我打印线程 ID,我可以看到从 0 到 7 的数字范围。(处理器有 4 核 8 线程)。所以并行化正在发生。有什么改进可以减少内存瓶颈吗?
-
有很多方法,但据我所知,没有什么简单的。当您将线程数减少到 4 个甚至 2 个(例如使用
num_threads()子句)时会发生什么? -
几乎没有什么变化。十分之一上升十分之一下降。可能是 CPU 噪音。
-
我玩过这个代码示例,也无法通过并行化获得很大的加速。但我对你运行的速度有多慢感到有点惊讶。在我的 PC(i5-2500 CPU @ 3.30GHz,4 核,4 线程,10 岁)上,使用给定的
N的每个步骤只需要大约 7 毫秒。对您来说,它真的慢了 2000 倍,还是您正在测量对该函数的数千次调用?还是你把你的单位搞混了?
标签: c gcc parallel-processing openmp