2012-05-12 40 views
0

假設我有一個包含n個元素和n_threads的向量。 我想使用#pragma omp parallel,使得每個線程接收n/n_threads塊大小, 和最後一個取決於大小寫。OpenMP基於運行時參數設置固定塊大小

#include <stdio.h> 
#include <omp.h> 

int main() 
{ 

    int *v = malloc (n * sizeof(int)); 

    #pragma omp parallel for (what should i put here?) 
    for(i = 0; i < n; ++i) 
    { 
     ++v[i]; 
    } 
    return 0; 
} 

例:N = 10003,n_threads = 4

  • thread_0應該得到2500塊
  • thread_1應該得到2500塊
  • thread_2應該得到2500塊
  • thread_3應該得到2503大塊

回答

2

總之 - 你不能去做。您只需指定schedule(static)子句而不指定塊大小,並且OpenMP運行時會將迭代次數分爲幾乎相同大小的塊。具體到底要做什麼取決於實施。這是OpenMP標準說,關於靜態調度:

當指定的時間表(靜態,CHUNK_SIZE),迭代分成大小CHUNK_SIZE的塊,和塊分配給線程球隊在圓按線程編號順序排列。

當沒有指定chunk_size時,迭代空間被分成大小近似相等的塊,並且每個線程至多分配一個塊。請注意,在這種情況下塊的大小未指定。

對於n = 10003和n_threads = 4,則可以指定的2500塊大小和迭代空間將被divied成大小2500,2500,2500,2500和3,它們將被分配給線程0的塊,1,2,3和0.因此,線程0將獲得2503次迭代,但它們在迭代空間中不會連續。如果你沒有指定塊的大小,則由實現決定哪個線程給予額外的迭代。

+0

我只知道運行時的矢量大小(隱含地也是chunk_size)。我試圖避免使用pthreads,但似乎我不能使用openmp來做我現在需要的東西。 –

+0

下面是GNU OpenMP運行時間如何在Mac OS X的4個線程之間使用'schedule(static)'調度103次迭代的示例:線程0-26迭代,線程1-26迭代,線程2-26迭代,線程3 - 25次迭代。所有迭代都是連續的。 –