我正在尝试用 C (OpenMP) 通过向量乘法编写矩阵
但是当我添加处理器时我的程序会变慢......
1 proc - 1,3 s
2 proc - 2,6 s
4 proc - 5,47 s
我在我的电脑(核心 i5)和我们学校的集群上测试了这个,结果是相同的(程序变慢)
这是我的代码(矩阵是 10000 x 10000),向量是 10000:
double start_time = clock();
#pragma omp parallel private(i) num_threads(4)
{
tid = omp_get_thread_num();
world_size = omp_get_num_threads();
printf("Threads: %d\n",world_size);
for(y = 0; y < matrix_size ; y++){
#pragma omp parallel for private(i) shared(results, vector, matrix)
for(i = 0; i < matrix_size; i++){
results[y] = results[y] + vector[i]*matrix[i][y];
}
}
}
double end_time = clock();
double result_time = (end_time - start_time) / CLOCKS_PER_SEC;
printf("Time: %f\n", result_time);
我的问题是:有什么错误吗?对我来说这似乎很简单并且应该加快速度
我基本上已经回答了这个问题使用 openmp 并行化矩阵乘以列和行向量 https://stackoverflow.com/questions/23277508/parallelizing-matrix-times-a-vector-by-columns-and-by-rows-with-openmp/23277953#23277953.
当您写入时,您会遇到竞争条件results[y]
。要解决这个问题,并且仍然并行化内部循环,您必须制作私有版本results[y]
,并行填充它们,然后将它们合并到关键部分。
在下面的代码中我假设您正在使用double
,将其替换为float
or int
或您正在使用的任何数据类型(请注意,您的内部循环将遍历第一个索引matrix[i][y]
这对缓存不友好)。
#pragma omp parallel num_threads(4)
{
int y,i;
double* results_private = (double*)calloc(matrix_size, sizeof(double));
for(y = 0; y < matrix_size ; y++) {
#pragma omp for
for(i = 0; i < matrix_size; i++) {
results_private[y] += vector[i]*matrix[i][y];
}
}
#pragma omp critical
{
for(y=0; y<matrix_size; y++) results[y] += results_private[y];
}
free(results_private);
}
如果这是家庭作业,并且您想真正给老师留下深刻印象,那么可以在没有关键部分的情况下进行合并。请参阅此链接以了解该怎么做在不使用批评家的情况下与 openmp 并行填充直方图数组缩减 https://stackoverflow.com/questions/16789242/fill-histograms-array-reduction-in-parallel-with-openmp-without-using-a-critic虽然我不能保证它会更快。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)