本篇文章只是记录api的用法和回顾,方便记忆
openMP
openMP提供“基于指令”的共享内存API。这就意味着在c和c++中,有一些特殊的预处理指令pragma。在系统中加入预处理指令一般时用来允许不是基本C语言的规范的行为。
不支持pragma的编译器会忽略pragma指令提示的那些语句,这样就允许使用pragma的程序在不支持它的平台上运行。
OpenMP的pragma总是以 ##pragma omp 开始
简单例子
#include
#include
#include
void Hello(void);
int main(int argc,char* argv[])
{
/*
long strtol(
const char* number_p *in*, 第一个参数是字符串
const char** end_p *out*,终止的非法字符串
int base *in* 进制(2-36)
)
例:
char buffer[20]="10379cend$3";
char *stop;
printf("%d\n",strtol(buffer, &stop, 2));
printf("%s\n", stop);
输出结果:
2
379cend$3
*/
int thread_count = strtol(argv[1],NULL,10);
#pragma omp parallel num_threads(thread_count)
Hello();
return 0;
}
void Hello(void)
{
int my_rank = omp_get_thread_num();
int thread_count = omp_get_num_threads();
printf("hello from thread %d of %d \n",my_rank,thread_count);
}
#编译
gcc -g -Wall -fopenmp -o main main.c
#-g :产生供gdb调试用的可执行文件
# http://www.jianshu.com/p/30ffc01380a0
#-Wall:编译后显示所有警告
#-fopenmp 使用mpi支持
#-o:输出到指定文件
#pragma omp pallel
使用parallel是用来表明之后的结构化代码块(一个结构化代码块时一条C语句或者只有一个入口和一个出口的一组复合C语句)应该被多个线程并行执行。
完成代码块前会有一个隐式路障,先完成的线程必须等待线程组其他线程完成代码块。
- num_threads 子句
允许程序员指定执行后代码块的线程数
程序可以启动的线程数可能会受系统定义的限制。OpenMP标准并不保证实际能够启动thread_count个线程。
#pragma omp parallel num_threads(thread_count)
线程被同一个进程派生,这些线程共享大部分资源。有它自己的栈和计数器。当一个线程完成了执行ÿ