測試是否reduction能負責在循環任何地方的值 主要是把total放在不同的地方 看看最後結果是否和想要結果一致
此處total是shared的在用之前已經被賦值
測試程序1:
#include <stdio.h>
#include <omp.h>
int main(){
int i,j,k, tid,total;
total = 0;
#pragma omp parallel private(j,k,tid)
{
#pragma omp for reduction(+: total)
for(i = 0; i < 3; i++){
for(j = 0; j< 4; j++){
total = 0;
for(k = 0; k < 3; k++){
tid = omp_get_thread_num();
printf("i is %d, j = %d, k = %d, tid = %d\n", i, j, k, tid);
}
}
total++;
}
}
printf("total is %d\n", total);
return 0;
}
想要結果: total是3
實際結果:total is 3
測試二: 將total放入j循環的那層
#include <stdio.h>
#include <omp.h>
int main(){
int i,j,k, tid,total;
total = 0;
#pragma omp parallel private(j,k,tid)
{
#pragma omp for reduction(+: total)
for(i = 0; i < 3; i++){
for(j = 0; j< 4; j++){
total = 0;
for(k = 0; k < 3; k++){
tid = omp_get_thread_num();
printf("i is %d, j = %d, k = %d, tid = %d\n", i, j, k, tid);
}
total++;
}
}
}
printf("total is %d\n", total);
return 0;
}
想要結果12
實際結果12
測試三: 講total放入最內層循環
#include <stdio.h>
#include <omp.h>
int main(){
int i,j,k, tid,total;
total = 0;
#pragma omp parallel private(j,k,tid)
{
#pragma omp for reduction(+: total)
for(i = 0; i < 3; i++){
for(j = 0; j< 4; j++){
total = 0;
for(k = 0; k < 3; k++){
tid = omp_get_thread_num();
printf("i is %d, j = %d, k = %d, tid = %d\n", i, j, k, tid);
total++;
}
}
}
}
printf("total is %d\n", total);
return 0;
}
想要結果36
實際結果36
結論 無論total放在哪兒 reduction總能給出想要的結果 但total必須是shared