openMP不在visual studio中创建线程

时间:2010-12-23 01:58:14

标签: openmp

我的openMP版本没有提供任何速度提升。我有一个双核机器,CPU使用率总是50%。所以我尝试了Wiki中给出的示例程序。看起来openMP编译器(Visual Studio 2008)不会创建多个线程。

这是该计划:

 #include <omp.h>
 #include <stdio.h>
 #include <stdlib.h>

 int main (int argc, char *argv[]) {
   int th_id, nthreads;
   #pragma omp parallel private(th_id)
   {
     th_id = omp_get_thread_num();
     printf("Hello World from thread %d\n", th_id);
     #pragma omp barrier
     if ( th_id == 0 ) {
       nthreads = omp_get_num_threads();
       printf("There are %d threads\n",nthreads);
     }
   }
   return EXIT_SUCCESS;
 }

这是我得到的输出:

Hello World from thread 0
There are 1 threads
Press any key to continue . . .

4 个答案:

答案 0 :(得分:17)

该程序没有任何问题 - 因此可能存在编译或运行方式的问题。这是VS2008 Pro吗?一个快速谷歌周围暗示标准版没有启用OpenMP。是否在属性中启用了OpenMP - &gt; C / C ++ - &gt;语言 - &gt; OpenMP的? (例如,你用/ openmp编译)?运行此环境变量时,环境变量OMP_NUM_THREADS是否设置为1?

答案 1 :(得分:3)

如果要使用多个线程测试程序,可以使用几种构造来指定OpenMP并行区域中的线程数。它们按优先顺序排列:

  • 评估 if 条款
  • 设置 num_threads 子句
  • 使用 omp_set_num_threads()库函数
  • 设置 OMP_NUM_THREADS 环境变量
  • 实施默认

听起来您的实现默认为一个线程(假设您的环境中没有设置 OMP_NUM_THREADS = 1 )。

例如,要使用4个主题进行测试,您可以将 num_threads(4)添加到 #pragma omp parallel 指令。

正如另一个答案所指出的那样,你不会真正看到任何“加速”,因为你没有利用任何并行性。但是想要运行一个带有几个线程的“hello world”程序来测试它是合理的。

答案 2 :(得分:-1)

为什么这个程序需要多个线程?显然,OpenMP意识到它不需要创建额外的线程来运行没有循环的程序,也没有任何可以并行运行的代码。

尝试使用OpenMP运行一些并行的东西。像this这样的东西:

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#define CHUNKSIZE   10
#define N       100

int main (int argc, char *argv[]) 
{
int nthreads, tid, i, chunk;
float a[N], b[N], c[N];

/* Some initializations */
for (i=0; i < N; i++)
  a[i] = b[i] = i * 1.0;
chunk = CHUNKSIZE;

#pragma omp parallel shared(a,b,c,nthreads,chunk) private(i,tid)
  {
  tid = omp_get_thread_num();
  if (tid == 0)
    {
    nthreads = omp_get_num_threads();
    printf("Number of threads = %d\n", nthreads);
    }
  printf("Thread %d starting...\n",tid);

  #pragma omp for schedule(dynamic,chunk)
  for (i=0; i<N; i++)
    {
    c[i] = a[i] + b[i];
    printf("Thread %d: c[%d]= %f\n",tid,i,c[i]);
    }

  }  /* end of parallel section */

}

如果您想要一些硬核内容,请尝试运行one of these

答案 3 :(得分:-1)

如前所述,http://docs.oracle.com/cd/E19422-01/819-3694/5_compiling.html我通过将环境变量OMP_DYNAMIC设置为FALSE来实现它的工作