我是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分解不起作用?