[英]OpenMP Parallel for with scheduling in C
我想運行一個並行的,預定的(例如靜態/動態/引導)for循環,其中每個線程都有自己的一組變量,基於它們的thread-id。 我知道在並行pragma中聲明的任何變量都是私有的,但我不想在for循環的每次迭代中重新聲明變量。
在我的特定情況下,只要一組生成坐標位於圓圈內部或外部以近似pi,我就會計算。 我正在使用erand48(int [3] seed)在每個線程中生成這些坐標,並通過為每個線程提供一組不同的'seed'值,我將獲得更多種類的數字用於近似(也是此模擬的要求)。
long long int global_result = 0;
int tID = omp_get_thread_num();
int[3] seed;
seed[0] = (((tid*tid + 15) * 3)/7);
seed[1] = ((((tid + tid) * 44)/3) + 2);
seed[2] = tid;
int this_result = 0;
# pragma omp parallel for num_threads(thread_count) schedule(runtime)
for(i = 0; i < chunksize; i++){
x = erand48(seed);
y = erand48(seed);
((x*x+y*y)>=1)?(this_result++):;
}
# pragma omp critical{
global_result+= this_result;
}
這是我能夠代表我正在嘗試做的最好的事情。 我希望'this_result','tid'和'seed'的值具有私有范圍。
您可以在#pragma指令中使用“private”這樣的子句:
#pragma omp parallel for private(this_result, tid, seed) num_threads(thread_count) schedule(runtime)
如果我理解你的問題,應該這樣做。
我知道在並行pragma中聲明的任何變量都是私有的,但我不想在for循環的每次迭代中重新聲明變量。
將#pragma omp parallel分為兩個獨立的組件#pragma omp parallel和#pragma omp for。 然后,您可以在並行中但在循環外部聲明局部變量。 像這樣的東西
int global_result = 0;
#pragma omp parallel reduction(+:global_result)
{
int tid = omp_get_thread_num();
int seed = (((tid*tid + 15) * 3)/7);
// Typo, as commented below
// # pragma omp parallel for schedule(runtime)
// What is intended!
# pragma omp for schedule(runtime)
for(i = 0; i < chunksize; i++){
float x = erand48(&seed);
float y = erand48(&seed);
if ((x*x+y*y)>=1)
this_result++;
}
global_result += this_result;
}
有更好的方法來計算pi,但是:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.