簡體   English   中英

具有特定線程的 OpenMP for 循環

[英]OpenMP for loop with specific threads

我是並行編程的新手。 我正在嘗試使點雲處理過程並行。 我在下面分享我的程序結構。 首先,我將點雲分成部分雲。 我的目標是每個線程都必須分別調用 fillFrustumCloud() function。

int num_threads = 12;

std::vector<CloudColored::Ptr> vector_colored_projected_clouds(num_threads);
std::vector<Cloud::Ptr> vector_projected_clouds(num_threads);

omp_set_num_threads(num_threads);

// private( ) shared()
#pragma omp parallel  shared(vector_colored_projected_clouds,vector_projected_clouds)
{
    
    for(int i=0; i<num_threads; i++)
    {

        #pragma omp critical
        {
            std::cout << "Thread id: " << omp_get_thread_num() << " loop id: " << i <<  std::endl;
        }

        const unsigned int  start_index = cloud_in->size()/num_threads*i;
        const unsigned int  end_index = cloud_in->size()/num_threads*(i+1);

        Cloud::Ptr partial_cloud(new Cloud);

        if(i==num_threads-1)
        {
            partial_cloud->points.assign(cloud_in->points.begin()+start_index, cloud_in->points.end());
        }else{
            partial_cloud->points.assign(cloud_in->points.begin()+start_index, cloud_in->points.begin()+end_index);
        }

            LidcamHelpers::fillFrustumCloud(partial_cloud, mat_point_transformer, img_size, vector_colored_projected_clouds,
                                            vector_projected_clouds, i, interested_detections, id, reshaped_img);
    }
}

但 output 是:

Thread id: 0 loop id: 0
Thread id: 1 loop id: 0
Thread id: 2 loop id: 0
Thread id: 3 loop id: 0
Thread id: 0 loop id: 1
Thread id: 1 loop id: 1
Thread id: 2 loop id: 1
Thread id: 3 loop id: 1
Thread id: 0 loop id: 2
Thread id: 3 loop id: 2
Thread id: 2 loop id: 2
Thread id: 1 loop id: 2
Thread id: 3 loop id: 3
Thread id: 1 loop id: 3
Thread id: 2 loop id: 3
Thread id: 0 loop id: 3

根據我的目標,它應該是這樣的:

Thread id: 0 loop id: 0
Thread id: 1 loop id: 1
Thread id: 2 loop id: 2

請注意:我通過引用將 vector_colored_projected_clouds 和 vector_projected_clouds 傳遞到 function 以存儲結果。 我想它們應該是共享變量。

這個#pragma omp parallel構造函數將創建一個並行區域,其中包含您設置的盡可能多的線程。 因此,當您這樣做時:

#pragma omp parallel
{
    for(int i=0; i<num_threads; i++)
    {
       ... 
    }
}

並行區域中的每個線程都將執行循環的所有迭代。 這就是為什么你有 16 行輸出(4 個線程 x 4 個循環迭代)。

如果要在線程之間分配循環的迭代,則應使用#pragma omp for代替。 因此,在您的代碼中,您可以執行以下操作:

#pragma omp parallel
{
    #pragma omp for
    for(int i=0; i<num_threads; i++)
    {
       ... 
    }
}

或者

#pragma omp parallel for
for(int i=0; i<num_threads; i++)
{
   ... 
}

由於您只想在線程之間分配循環的迭代,因此可以使用后者(#pragma omp parallel for )。

看起來好像您正在使用

#pragma omp critical
{
    std::cout << "Thread id: " << omp_get_thread_num() << " loop id: " << i <<  std::endl;
}

用於調試目的。 但是請記住,即使使用critical區域,線程 output 的順序也是不確定的。 如果您希望線程確定性地使用 output,請使用#pragma omp ordered而不是critical。 ordered構造函數將強制它包裹的代碼塊將按照與順序執行代碼相同的順序執行。

暫無
暫無

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

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