[英]parallel programming in C with openmp
現在,我正在學習有關使用openmp在C中進行並行編程的知識,而現在我偶然發現了以下問題。 我有一個想要循環的簡單for循環。 使用openmp,我認為以下代碼可以完成這項工作
unsigned long int teller_groot;
int boel = 0;
int k = 0;
int l = 1;
unsigned long int sum2;
int thread_id;
int nloops;
#pragma omp parallel private(thread_id, nloops)
{
sum2 = 0;
#pragma omp for
for (teller_groot=1000000; teller_groot<1000000000000; teller_groot++)
{
boel = 0;
for (int i = 0; i < 78498; i++)
{
if (floor(teller_groot / array[i]) == teller_groot / array[i])
{
boel = 1;
break;
}
}
if (boel == 0)
{
sum2 = sum2 + teller_groot;
}
if (sum2 >= 1000000000)
{
sum2 = sum2 - 1000000000;
}
if (k == 10000000)
{
printf("%d, ", l);
l++;
k = 0;
}
k++;
}
thread_id = omp_get_thread_num();
printf("Thread %d performed %d iterations of the loop.\n", thread_id, nloops);
}
編碼
if (k == 10000000)
{
printf("%d, ",l);
l++;
k = 0;
}
k++;
我只是想知道我們在循環中走了多遠。 如果我運行該程序,它將不會打印任何內容,這意味着它不會計算任何內容。 那么代碼有什么問題呢? 謝謝。
您已經在openmp for
循環之外聲明了變量k
(以及其他)。 在並行區域外聲明變量時,默認情況下它們具有共享作用域。 這意味着您使用的所有線程都將檢查並寫入相同的k
變量,這可能導致爭用情況。
如果要使用不同的線程寫入同一變量k
,則可以使用鎖或原子更新來產生所需的行為。
否則,請在並行區域開頭的#pragma
語句中將k
聲明為私有變量:
#pragma omp parallel private(thread_id, nloops, k)
此處提供了一個很好的入門手冊: http : //supercomputingblog.com/openmp/tutorial-parallel-for-loops-with-openmp/
我沒有足夠的聲譽來發表評論,所以我正在寫答案。
您的代碼的哪一部分完全卡住了? ( 卡住是不是意味着要花費大量時間?)
因為:
if (floor(teller_groot / array[i]) == teller_groot / array[i])
{
boel = 1;
break;
}
您要做的是將22/41 = 0.536簡化為=> 0.5的結果(然后簡化一下),然后檢查0.536 == 0.5,這是否不相等,因此可能無法執行命令中斷 ,具體取決於什么在未指定的數組中。
另外,您的許多變量都被共享,包括array ,這可能也會有所作為,並且未指定變量nloops (除非在您顯示的代碼上方)
請查看有關openmp的以下pdf文件: http : //openmp.org/mp-documents/OpenMP4.0.0.Examples.pdf
編輯:順便說一句,嘗試在printf()之后刷新緩沖區: fflush(stdout)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.