我正在寫一個程序,其中一堆不同的類,所有存儲在向量中,使用公共數據結構在私有成員上執行並行操作。我想爲使用OpenMP的多個處理器並行化它,但是我有兩個有關代碼中兩個操作的問題,下面的示例在下面的註釋中指出了這兩個問題,它們顯示了程序邏輯的簡化形式。是隻讀的全局變量和寫入私人類成員在openmp中的「虛假共享」
#include <omp.h>
#include <iostream>
#include <sys/timeb.h>
#include <vector>
class A {
private :
long _i;
public :
void add_i(long &i) { _i += i; }
long get_i() const { return _i; }
};
int main()
{
timeb then;
ftime(&then);
unsigned int BIG = 1000000;
int N = 4;
std::vector<long> foo(BIG, 1);
std::vector<A *> bar;
for (unsigned int i = 0; i < N; i++)
{
bar.push_back(new A());
}
#pragma omp parallel num_threads(4)
{
for(long i = 0; i < BIG; i++)
{
int thread_n = omp_get_thread_num();
// read a global variable
long *to_add = &foo[i];
// write to a private variable
bar[thread_n]->add_i(*to_add);
}
}
timeb now;
ftime(&now);
for (int i = 0; i < N; i++)
{
std::cout << bar[i]->get_i() << std::endl;
}
std::cout << now.millitm - then.millitm << std::endl;
}
第一條評論涉及從全局foo讀取。這是「虛假分享」(或數據晃盪)?我讀的大部分資源都是關於寫入操作方面的虛假共享,但我不知道讀取操作是否也適用。
第二個註釋解決了對bar中的類的寫入操作。同樣的問題:這是錯誤的分享?他們正在寫入同一個全局數據結構中的元素(這是我讀過的,晃盪),但只是在元素內部對私有數據進行操作。
當我與一個for循環替換OpenMP的宏,該程序是由約25%的速度,所以我猜我做錯了什麼......
你的例子很奇怪。你說過一堆不同的課程,但我認爲你是指同一班級的一堆不同的對象?而你的意思是四個。這不是很多。但它也被設置爲似乎任意的線程數。你爲什麼不向我們展示你的非並行代碼,然後我們可以告訴你如何最好地並行化它。 –