概述
制导指令
库函数
子句
栗子: 计算pi
#include <stdio.h>
#include <omp.h>
#define NUM_THREADS 4
int main(int argc, char* argv[])
{
int a[1000]={0};
/*
omp_set_num_threads(4);
#pragma omp parallel
{
printf("%d of %d threads\n", omp_get_thread_num(), omp_get_num_threads());
}
*/
int sum1=0;
int sum2=0;
int i;
for(i=0;i<10;i++)
sum1 += i;
printf("sum1 = %d\n",sum1);
omp_set_num_threads(NUM_THREADS);
#pragma omp parallel
{
int id = omp_get_thread_num();
printf("id = %d\n",id);
for(i=id,a[id]=0;i<10;i+=NUM_THREADS)
a[id]+=i;
}
for(i=0;i<=NUM_THREADS;i++){
printf("a[%d] = %d\n",i,a[i]);
sum2 += a[i];
}
printf("sum2 = %d\n",sum2);
return 0;
}
循环并行制导
#include <stdio.h>
#include <omp.h>
#define NUM_THREADS 4
int main(int argc, char* argv[])
{
int a[1000]={0};
/*
omp_set_num_threads(4);
#pragma omp parallel
{
printf("%d of %d threads\n", omp_get_thread_num(), omp_get_num_threads());
}
*/
int sum1=0;
int sum2=0;
int i;
#pragma omp parallel for
for(i=0;i<10;i++)
sum1 += i;
printf("sum1 = %d\n",sum1);
double st,ed;
int id;
st = omp_get_wtime();
omp_set_num_threads(NUM_THREADS);
#pragma omp parallel
{
id = omp_get_thread_num();
printf("id = %d\n",id);
for(i=id,a[id]=0;i<10;i+=NUM_THREADS)
a[id]+=i;
}
ed = omp_get_wtime();
printf("wtime = %f\n",ed-st);
for(i=0;i<=NUM_THREADS;i++){
printf("a[%d] = %d\n",i,a[i]);
sum2 += a[i];
}
printf("sum2 = %d\n",sum2);
return 0;
}
数据竞争
限定制导
#include<omp.h>
#define NUM_THREADS 4
int main(){
omp_set_num_threads(NUM_THREADS);
#pragma omp parallel private(x,id)
{
int id = omp_get_thread_num();
#pragma omp for private(x) reduction(+:sum)
for(i=0;i<N;i++){
x = (i+1);
sum += 4.0/x;
}
}
}