我尝试用很多循环制作矩阵时间向量,我想加快过程
这是我的代码
#include <stdio.h>
#include <time.h>
#include <omp.h>
int main()
{
int i, j, n, a[719][719], b[719], c[719];
clock_t start = clock();
n = 100; //Max 719
printf("Matrix A\n");
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
a[i][j] = 10;
printf("%d ", a[i][j]);
}
printf("\n");
}
printf("\nMatrix B\n");
#pragma omp parallel private(i) shared(b)
{
#pragma omp for
for (i = 0; i < n; ++i) {
b[i] = 5;
printf("%d\n", b[i]);
}
}
printf("\nA * B\n");
#pragma omp parallel private(i) shared(c)
{
#pragma omp for
for (i = 0; i < n; ++i) {
c[i] = 0;
}
}
#pragma omp parallel private(i,j) shared(n,a,b,c)
{
#pragma omp for schedule(dynamic)
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
c[i] += b[j] * a[j][i];
}
}
}
#pragma omp parallel private(i) shared(c)
{
#pragma omp for
for (i = 0; i < n; ++i) {
printf("%d\n", c[i]);
}
}
clock_t stop = clock();
double elapsed = (double)(stop - start) / CLOCKS_PER_SEC;
printf("\nTime elapsed: %.5f\n", elapsed);
return 0;
}
我也认为这段代码中有很多无效的部分,如果有人能将代码修复到有效代码中并加快进程,我将不胜感激
答案 0 :(得分:0)
我警告你,我最近尝试做类似的事情(矩阵乘法),我没有得到我希望的结果:有两个内核和超线程我运行我的程序和加速方面的线性实现非常小,只使用非常大的矩阵。对于小尺寸矩阵,由于线程开销,您只会减慢算法速度。
您可以使用collapse(n)
声明。线程被应用于嵌套循环。你应该减少你的开销。可以在此处找到OpenMP指令的快速概述(也是崩溃):http://bisqwit.iki.fi/story/howto/openmp/。
您可以查看我在此处写的代码:http://pastebin.com/edi4DgrJ 您可以在编译时定义矩阵的大小。只需更改定义。
你也可以使用&#34;浓缩&#34; OpenMP指令(如parallel for
)加速编程会话(我也认为代码的可读性更好)。