簡體   English   中英

在 OpenMP 中使用一致的 RNG

[英]Using consistent RNG with OpenMP

所以我有一個函數,我們稱之為dostuff() ,它對我的​​應用程序有時在內部進行並行化或多次執行並並行化整個事情是有益的。 盡管在兩個用例之間,該功能不會改變。

注意: object足夠大,無法將其存儲在列表中,因此必須在每次迭代時將其丟棄。

因此,假設我們的代碼如下所示:

bool parallelize_within = argv[1];
if (parallelize_within) {
    // here we assume parallelization is handled within the function dostuff()
    for (int i = 0; i < 100; ++i) {
        object randomized = function_that_accesses_rand();
        dostuff(i, randomized, parallelize_within);
    }
} else {
#pragma omp parallel for
    for (int i = 0; i < 100; ++i) {
        object randomized = function_that_accesses_rand();
        dostuff(i, randomized, parallelize_within);
    }
}

顯然,我們遇到了dostuff()將在同一程序的不同迭代中讓線程在不同時間訪問隨機對象的問題。 parallelize_within == true時不是這種情況,但是當我們每個線程單獨並行運行dostuff()時,有沒有辦法保證根據迭代按順序訪問隨機對象? 我知道我可以這樣做:

#pragma omp parallel for schedule(dynamic)

這將保證最終,隨着迭代在運行時動態地分配給線程,對象將按照迭代編號的順序訪問 rand,但對於第一組迭代,它將是完全隨機的。 關於如何避免這種情況的任何建議?

  1. 首先,您必須確保function_that_accesses_randdo_stuff都是線程安全的。

  2. 如果使用if子句,則不必復制代碼: #pragma omp parallel for if(!parallelize_within)

  3. 確保在函數dostuff(i, randomized,...); i反映了創建randomized對象的順序,您必須執行以下操作:

int j = 0;
#pragma omp parallel for if(!parallelize_within)
for (int i = 0; i < 100; ++i) {
    int k;
    object randomized;
    #pragma omp critical
    {
        k = j++;
        randomized = function_that_accesses_rand();        
    }
    dostuff(k, randomized, parallelize_within);
}
  1. 如果您的function_that_accesses_rand允許使用關鍵部分,您可以取消使用critical部分,但如果不知道您的功能,我無法更具體。 一種解決方案是此函數返回表示訂單的值。 不要忘記這個函數必須是線程安全的!
#pragma omp parallel for if(!parallelize_within)
for (int i = 0; i < 100; ++i) {
    int k;
    object randomized = function_that_accesses_rand(k);        
    dostuff(k, randomized, parallelize_within);
}

... function_that_accesses_rand(int& k){
 ...  
 #pragma omp atomic capture
 k = some_internal_counter++;
 ...
} 

您可以預先生成隨機對象並將其存儲在列表中。 然后在 omp 循環中有一個變量,每個線程遞增。

// generate random objects
i=0
#pragma omp parallel for
for( ... ){
  do_stuff(...,rand_obj[i],...)

暫無
暫無

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

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