C程序使用openmp时没有起到作用

来源:互联网 发布:免费淘宝代码 编辑:程序博客网 时间:2024/06/01 07:58

首先看C文件text.c ,代码如下:

#include <omp.h>#include <stdio.h>#include <stdlib.h>int main(int argc,char* argv[]){        int i = 0;        #pragma omp parallel <pre name="code" class="cpp">        printf("hello world\n");
  return 0;}

其中下面的这条语句的作用就是启动多线程,对紧跟的大花括号内的代码段使用多线程并行多次执行!

        #pragma omp parallel        {               //此处代码将会被多个线程执行               .......        }
编译命令为:

        gcc text.c -fopenmp
运行结果应该是这样的:

<pre name="code" class="cpp">        hello world<pre name="code" class="cpp"><pre name="code" class="cpp">        hello world

<pre name="code" class="cpp">        hello world
<pre name="code" class="cpp">        hello world
输出了4次,也就是 #pragma omp parallel  产生了4个线程都执行了打印语句,为什么产生了4个线程?这是因为我的电脑的处理器数就是4个,所以默认会产生与处理器个数相等的线程,所以如果你的电脑只有一个处理器,那就只能产生一个线程,所以这种情况下输出的结果与不加#pragma omp parallel 的效果是一样的,这就是应该就是使用openmp时没有起到作用的一个可能的原因。

那如何修改#pragma omp parallel 命令产生的线程数量呢?有两个方法,方法1:重新买一个多核的电脑,这个最简单!!!这种方法专供土豪使用!

还有另外一种方法,就是修改环境变量的值;如下:

        export OMP_NUM_THREADS=6
重新编译,结果如下:

<pre name="code" class="cpp">hello world<pre name="code" class="cpp"><pre name="code" class="cpp">        hello world

<pre name="code" class="cpp">        hello world
<pre name="code" class="cpp">        hello world<pre name="code" class="cpp"><pre name="code" class="cpp">        hello world<pre name="code" class="cpp"><pre name="code" class="cpp">        hello world<pre name="code" class="cpp"><pre name="code" class="cpp"><pre name="code" class="cpp"><pre name="code" class="cpp"><pre name="code" class="cpp"><pre name="code" class="cpp"><pre name="code" class="cpp"><pre name="code" class="cpp">        hello world

第三种方法:通过omp_get_num_threads(numbs)函数设置线程数量,函数参数numbs就是线程的个数,omp_get_thread_num()函数使用来获取当前线程的ID的,从0开始,示例代码如下:

#include <omp.h>#include <stdio.h>#include <stdlib.h>int main(int argc,char* argv[]){        int i = 0;        omp_set_num_threads(4);        #pragma omp parallel for        for (i=0;i<10;i++)        {                sleep(1);                printf("i=%d\n",omp_get_thread_num());        }        printf("hello world\n");        return 0;}

重新编译运行结果如下:

i=0i=3i=1i=2i=0i=1i=2i=0i=1i=2hello world
其中i的值是线程的编号,可以看到编号从0~3,总共出现了4个线程,所以 omp_set_num_threads(4)设置线程数量成功了!

0 0
原创粉丝点击