简单的 OpenMP saxpy 的加速不好
bad speedup on simple OpenMP saxpy
我在获取一个简单的 SAXPY 程序以使用 OpenMP 适当地扩展其性能时遇到了问题。
#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
知道我遇到的问题是什么吗?
您在 #pragma omp
指令中忘记了 for
:
#pragma omp parallel for default(none) private(i) shared(a, N, x,y)
没有 for
就没有工作共享,每个线程都将遍历整个范围 [1, N)
我在获取一个简单的 SAXPY 程序以使用 OpenMP 适当地扩展其性能时遇到了问题。
#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
知道我遇到的问题是什么吗?
您在 #pragma omp
指令中忘记了 for
:
#pragma omp parallel for default(none) private(i) shared(a, N, x,y)
没有 for
就没有工作共享,每个线程都将遍历整个范围 [1, N)