2015-11-25 30 views
0

我无法获得一个简单的SAXPY程序来正确使用OpenMP来扩展其性能。在简单的OpenMP saxpy上加速性能不佳

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

int main(int argc, char** argv){ 
    int N = atoi(argv[1]), threads = atoi(argv[2]), i; 
    omp_set_num_threads(threads); 
    double a = 3.141592, *x, *y, t1, t2; 
    x = (double*)malloc(sizeof(double)*N); 
    y = (double*)malloc(sizeof(double)*N); 

    for(i = 0; i < N; ++i){ 
     x[i] = y[i] = (double)i; 
    } 

    t1 = omp_get_wtime(); 
    #pragma omp parallel for default(none) private(i) shared(a, N, x,y) 
    for(i = 0; i < N; ++i){ 
     y[i] = a*x[i] + y[i]; 
    } 
    t2 = omp_get_wtime(); 

    printf("%f secs\n", t2-t1); 
} 

我编译如下:

gcc main.c -lm -O3 -fopenmp -o prog 

我为10M元素获得通过表现:

threads = 1 0.015097 secs 
threads = 2 0.013954 secs 

任何想法是我有问题吗?

+0

在其中你正在运行的架构? – simpel01

+0

在英特尔i7 4700HQ(笔记本电脑quadcore)以及16核英特尔至强机(8个内核的两个插槽)上尝试过。你能编译,测试并告诉你的加速吗? –

+0

做了一些诊断之后,我发现如果我把另一个循环放在里面,重复1000次指令,那么我就接近线性加速。是否有人知道原始SAXPY是否可以缩小多核CPU的性能? –

回答

1

你在你的#pragma omp指令忘了for

#pragma omp parallel for default(none) private(i) shared(a, N, x,y) 

没有for有工作分担没有,每个线程将会在整个全范围[1迭代,N)

+0

我正在讨论这个给我第二个 –

+0

这是一个错误的问题,但不是代码,对不起。不过,我现在已经修复了这个帖子。问题仍然存在,性能值更新,因为感谢您的帖子,我发现错误地放置在计时器上的错字。尽管如此,问题仍然存在,加速很小。 –

+1

那么,你总的执行时间太短了。考虑产卵线程是一个昂贵的操作,你需要足够的计算来补偿它。如果我在没有'O3'的情况下编译程序,我会得到线性加速,但我认为并行化它的方式并没有什么问题。 – simpel01