簡體   English   中英

OpenMP for循環會忽略num_threads子句

[英]OpenMP for loop ignores num_threads clause

我在VS2008中有以下代碼:

int i,j;
bool pr = false;
#pragma omp parallel for private(pr) num_threads(2)
for(i=0;i<PIC_X;i++)
{
    int rank = omp_get_thread_num();
    int count = omp_get_num_threads();
    if ( !pr )
    {
        printf_s("Hello from thread %d of %d\n", rank, count);
        pr = true;
    }
    for(j=0;j<PIC_Y;j++)
    {
        // do stuff
    }
}

(如果您想知道的話,請不要嘗試創建嵌套的OpenMP循環)。 問題是,num_threads子句完全無效:我只在輸出中得到“來自線程1的0的問候”。 我也嘗試使用omp_set_num_threads(2) ,但無濟於事。 是什么賦予了?

您已經在並行區域之外設置了pr,然后通過將其放在private子句中將pr設置為私有。 這意味着每個線程都有一個pr,但是私有pr變量未初始化。 對pr使用firstprivate而不是private,以便初始化private變量。

但是,對於默認情況下循環計數器是私有的,您是錯誤的。 (即變量i)的工作共享(或規范)的循環計數器是私有的(OMP V2.0規范的構造第2.4.1節)。 但是“ j”不是。 請參閱OpenMP V2.0規范(這是Microsoft在VS2008中支持的規范)的2.7.2數據共享屬性子句:

如果在遇到並行或工作共享結構時可見的變量,並且未在共享屬性子句或threadprivate指令中指定該變量,則該變量將被共享。 共享在並行區域的動態范圍內聲明的靜態變量。 共享堆分配的內存(例如,在C或C ++中使用malloc()或在C ++中使用new運算符)。 (但是,指向該內存的指針可以是私有的,也可以是共享的。)在並行區域的動態范圍內聲明了具有自動存儲持續時間的變量是私有的。

至於返回1的omp_get_num_threads(),我能想到的就是您沒有在啟用OpenMP標志的情況下進行編譯。

如果OpenMP將外部循環拆分為2(即,一個進程為0..PIC_X / 2),而另一個進程為最后一半,則只有一個進程將看到i == 0。

而且,如果您像我看到的所有圖像一樣組織圖像,則外部循環應為Y,內部循環應為X,內部循環應為OpenMP,因為這通常是圖像在內存中的組織方式。

暫無
暫無

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

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