簡體   English   中英

並行算法找到K個最近點

[英]Parallel algorithm to find the K closest points

我實現了以下代碼,使用“dat”中的數據點來計算每個點與所有其他點“dist”之間的距離矩陣。 然后我使用這個距離矩陣找到數據“最小”中每個點的K個最近點,然后用它來找到K個最近鄰居的總和。

以下算法是使用OpenMP的並行算法,它的工作非常精細。 我只需要建議讓它運行得更快。 任何建議都非常感謝。

vector<vector<double> > dist(dat.size(), vector<double>(dat.size()));
size_t p,j;
ptrdiff_t i;
double* sumKnn = new double[dat.size()];
vector<vector<int > > smallest(dat.size(), vector<int>(k));
#pragma omp parallel for private(p,j,i) default(shared)
for(p=0;p<dat.size();++p)
{
    int mycont=0;
    for (j = 0; j < dat.size(); ++j)
    {
        double ecl = 0.0;
        for (i = 0; i < c; ++i)
        {
            ecl += (dat[p][i] - dat[j][i]) * (dat[p][i] - dat[j][i]);
        }
        ecl = sqrt(ecl);
        dist[p][j] = ecl;
        //dist[j][p] = ecl;
        int index=0; 
        if(mycont<k && j!=p)
        {
            smallest[p][mycont]=j;
            mycont++;
        }
        else if(j!=p)
        {
            double max=0.0;
            int index=0;
            for(int i=0;i<smallest[p].size();i++)
            {
                if(max < dist[p][smallest[p][i]])
                {
                    index=i;
                    max=dist[p][smallest[p][i]];
                } 
            }
            if(max>dist[p][j])
            {
                smallest[p].erase(smallest[p].begin()+index);
                smallest[p].push_back(j);
            }
        }        
    }
    double sum=0.0;
    for(int r=0;r<k;r++)
        sum+= dist[p][smallest[p][r]];
    sumKnn[p]=sum; 
}  

這是一個評論而不是一個答案,但評論框太小了,......

OpenMP的一個有用方面是您可以逐步並行化串行程序。 因此,您的第一步應該是編寫一個解決您問題的序列代碼。 當你完成后,你可以再次發布並尋求並行化的幫助。

要並行化您的程序,找到最外層的循環語句,並考慮如何跨線程分布循環迭代將影響計算。 我懷疑你會想要創建一個關閉點的共享向量,因為循環會循環,然后只在一個線程的末尾對它進行排序。 或許不是。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM