首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >openmp并行性能

openmp并行性能
EN

Stack Overflow用户
提问于 2012-01-28 03:59:28
回答 2查看 681关注 0票数 1

我正在尝试使用openmp并行实现距离矩阵,其中我计算每个点和所有其他点之间的距离,所以到目前为止我想到的最好的算法花费O(n^2),并且我的算法在8处理器机器上使用10线程的openmp的性能在运行时间方面并不比串行方法更好,所以我想知道我在openmp方法上的实现是否有任何错误,因为这是我第一次使用openmp,所以如果我的which中有任何错误或者更好的“更快”的方法,请让我知道。下面是我的代码,其中"dat“是一个包含数据点的向量。

代码语言:javascript
复制
map <int, map< int, double> > dist;   //construct the distance matrix 

int c=count(dat.at(0).begin(),dat.at(0).end(),delm)+1;

#pragma omp parallel for shared (c,dist)

for(int p=0;p<dat.size();p++)
{

    for(int j=p+1;j<dat.size();j++)
    {
        double ecl=0;

        string line1=dat.at(p);
        string line2=dat.at(j);

        for (int i=0;i<c;i++)
        {

            double num1=atof(line1.substr(0,line1.find_first_of(delm)).c_str());

            line1=line1.substr(line1.find_first_of(delm)+1).c_str();

            double num2=atof(line2.substr(0,line2.find_first_of(delm)).c_str());

            line2=line2.substr(line2.find_first_of(delm)+1).c_str();

            ecl += (num1-num2)*(num1-num2);
        }

        ecl=sqrt(ecl);

#pragma omp critical
        {
            dist[p][j]=ecl;
            dist[j][p]=ecl;
        }
    }
}
EN

Stack Overflow用户

发布于 2012-02-08 12:48:20

正如已经指出的,使用临界区会减慢速度,因为一次只允许在该区段中有一个线程。绝对不需要使用临界区,因为每个线程都会将写入互斥的数据段,读取未修改的数据显然不需要保护。

我对代码缓慢的怀疑归结为线程上的工作分配不均匀。默认情况下,我认为openmp会在线程之间平均分配迭代。举个例子,假设你有8个线程和8个点:

-thread 0将得到7个距离计算

-thread 1将得到6个距离计算

..。

-thread 7将得到0距离计算

即使有更多的迭代,类似的不等式仍然存在。如果您需要说服自己,可以创建一个线程私有计数器来跟踪每个线程实际完成的距离计算。

使用parallel for这样的工作共享结构,您可以指定各种工作分配策略。在你的情况下,最好的选择是

代码语言:javascript
复制
#pragma omp for schedule(guided)

当每个线程请求一些for循环的迭代时,它将得到剩余循环(尚未分配给线程)的数量除以线程的数量。所以一开始你会得到很大的块,后来你会得到更小的块。这是一种自动负载平衡的形式,请注意,在动态分配迭代到线程时会有一些(可能很小的)开销。

为了避免第一线程得到不公平的大量工作,您的循环结构应该更改,以便较低的迭代具有较少的计算,例如将内部for循环更改为

代码语言:javascript
复制
for (j=0; j<p-1; j++)

另一件要考虑的事情是,当使用大量内核时,内存可能成为瓶颈。你有8个处理器,可能会争用2个或3个通道的DRAM (同一通道上的独立记忆棒仍然会争用带宽)。片上CPU缓存最多只能在所有处理器之间共享,因此您仍然没有比该程序的串行版本更多的缓存。

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9039308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档