为什么我的OpenMP代码比顺序代码慢?

时间:2016-10-09 23:08:02

标签: c performance vector openmp

我是OpenMp的新手,想在更大的项目中使用它并且已经这样做了,但没有成功。并行for循环的每次迭代都应该计算矩阵的顺序cholesky分解,但是并行代码的时序要慢10倍。

因为我已经编写了一个小的示例代码来更好地理解openmp。但不知何故,我的openmp代码比顺序代码慢(只是没有并行编译指示)。 这是简单的代码:

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

int main ( )
{
clock_t start,ende;
double totalTime;

int i, n = 100000000;
double s = 1.23;
double *x;
double *y;
x = (double *) calloc(n, sizeof(double));
y = (double *) calloc(n, sizeof(double));

for ( i = 0; i < n; i++ ){
    x[i] = ( double ) ( ( i + 1 ) % 17 );
    y[i] = ( double ) ( ( i + 1 ) % 31 );
}

start = clock();

#pragma omp parallel for num_threads(4) private(i)
for ( i = 0; i < n; i++ ){
    x[i] = x[i] + s * y[i];
}

ende = clock();
totalTime = (ende - start)/(double)CLOCKS_PER_SEC;
printf("Zeit: %.10f s\n",totalTime);

free(x);
free(y);

return 0;
}

我的时间是并行代码为0.625秒,顺序代码为0.328秒。当我用numthreads()降低时,我会得到更好的时间。带有numthreads(2)的0.453s和带有numthreads(1)的0.344s。

有人可以帮助我使用小示例代码以及为什么cholesky分解不起作用?

0 个答案:

没有答案