3

我是 OpenMP Programming 的新手,我已经在 GCC 上执行了几个 open-mp 示例程序。我想知道我将如何决定启动多少线程(即如何决定 omp_set_num_threads() 函数的参数)以在双核英特尔处理器上获得更好的性能。

*这是我的示例程序*

#include<math.h>

#include<omp.h>
#include<stdio.h>
#include<time.h>
#define CHUNKSIZE 10
#define N 100000
#define num_t 10

void main ()  
{
    int runTime;
    int i, chunk;
    int a[N], b[N], c[N],threads[num_t];
    int thread_one=0,thread_two=0;
    clock_t start,end;
    omp_set_num_threads(num_t); 
    /* Some initializations */
    for (i=0; i < N; i++)
    a[i] = b[i] = i + 2.0;
    chunk = CHUNKSIZE;
        #pragma omp parallel shared(a,b,c,chunk,threads) private(i)
    {

            #pragma omp for schedule(dynamic,chunk)
            for (i=0; i < N; i++)
            {
                c[i] = pow((a[i] * b[i]),10);
                threads[omp_get_thread_num()]++;

            }
    }  /* end of parallel section */
    for(i=-1;i<num_t;i++)
    printf("Thread no %d : %d\n",i,threads[i]);
}
4

3 回答 3

3

我的建议:不要打扰。如果它是一个计算密集型应用程序(openmp 主要用于和你在这里有什么),那么库本身将很好地管理所有内容。

于 2012-09-01T10:07:34.247 回答
3

根据经验,首先尝试将线程数设置为机器的内核数。然后尝试减少这个数字,看看是否有任何改善。

omp_set_num_threads顺便说一句,设置环境变量比使用,OMP_NUM_THREADS更方便做这样的测试

于 2012-09-01T07:36:28.950 回答
0

最佳线程数取决于许多参数,很难设计出一般的经验法则。

对于获取/计算比率较低的计算密集型任务,最好将线程数设置为等于 CPU 内核数。

对于繁重的内存绑定任务,增加线程数可能会在线程数等于内核数之前使内存带宽饱和。循环向量化会显着影响单个线程的内存带宽。在某些情况下,线程在 CPU 缓存中共享大量数据,但在某些情况下 - 它们不会,并且增加它们的数量会减少可用的缓存空间。此外,NUMA 系统通常提供比 SMP 更好的带宽。

在某些情况下,使用比内核更多的线程可以获得最佳性能 - 当在每个任务中观察到大量阻塞等待时确实如此。有时 SMT 或超线程可以隐藏内存延迟,有时则不能,这取决于正在执行的内存访问类型。

除非您可以对代码性能进行建模并对运行的最佳线程数做出有根据的猜测,否则只需尝试几个值。

于 2012-09-01T08:22:24.047 回答