我的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 . . .
答案 0 :(得分:17)
该程序没有任何问题 - 因此可能存在编译或运行方式的问题。这是VS2008 Pro吗?一个快速谷歌周围暗示标准版没有启用OpenMP。是否在属性中启用了OpenMP - &gt; C / C ++ - &gt;语言 - &gt; OpenMP的? (例如,你用/ openmp编译)?运行此环境变量时,环境变量OMP_NUM_THREADS是否设置为1?
答案 1 :(得分:3)
如果要使用多个线程测试程序,可以使用几种构造来指定OpenMP并行区域中的线程数。它们按优先顺序排列:
听起来您的实现默认为一个线程(假设您的环境中没有设置 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来实现它的工作