我有一段代碼是我前一段時間編寫的。它的唯一目的是用openMP做實驗。但我最近將MacBook Pro Lion(2011年初)改裝爲MacBook Pro Mountain Lion(2013年初)。如果它有助於獲得更多其他信息的硬件,我會很樂意給予他們。 代碼在舊版本上運行良好,這意味着8個線程在我的處理器上獲得了100%(98%min)的負載。現在,在我的新機器上重新編譯的相同代碼只能獲得62%的最大處理器負載。即使我提出了線程。處理器負載均採用「istat pro」進行測量。使用不同版本的操作系統的OpenMP性能差異
我的問題是什麼會導致這種情況發生?
編輯:問題似乎解決,如果我刪除在#pragma omp parallel for shared(largest_factor, largest)
。所以我得到#pragma omp parallel shared(largest_factor, largest)
但我仍然不明白爲什麼它的作品。
有問題的代碼:
#include <stdio.h>
#include <omp.h>
double fib(double n);
int main()
{
int data[] = {124847,194747,194747,194747,194747,
194747,194747,194747,194747,194747,194747};
int largest, largest_factor = 0;
omp_set_num_threads(8);
/* "omp parallel for" turns the for loop multithreaded by making each thread
* iterating only a part of the loop variable, in this case i; variables declared
* as "shared" will be implicitly locked on access
*/
#pragma omp parallel for shared(largest_factor, largest)
for (int i = 0; i < 10; i++) {
int p, n = data[i];
for (p = 3; p * p <= n && n % p; p += 2);
printf("\n%f\n\n",fib(i+40));
if (p * p > n) p = n;
if (p > largest_factor) {
largest_factor = p;
largest = n;
printf("thread %d: found larger: %d of %d\n",
omp_get_thread_num(), p, n);
}
else
{
printf("thread %d: not larger: %d of %d\n",
omp_get_thread_num(), p, n);
}
}
printf("Largest factor: %d of %d\n", largest_factor, largest);
return 0;
}
double fib(double n)
{
if (n<=1)
{
return 1;
}
else
{
return fib(n-1)+fib(n-2);
}
}
對'largest_factor'賦值和測試p'值是否更大時仍存在數據爭用條件。 – 2013-04-12 14:49:42
我想我明白你的意思了。好的,我解決了這個問題。嘿,這是一個低窪的水果問題! – 2013-04-12 16:54:29
我剛剛查看了一個經過測試的代碼,但空閒時間現在爲50到63%。但是你說它可能會變慢。我會試着瞭解你對代碼做了什麼。感謝您的幫助。 – 2013-04-15 17:36:46