簡體   English   中英

使用openmp在C中進行並行編程

[英]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.

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