【问题标题】:C with OpenMP: Matrix times vectorC 与 OpenMP:矩阵时间向量
【发布时间】:2017-01-19 02:40:38
【问题描述】:

我试图用很多循环来制作矩阵时间向量,我想加快这个过程

这是我的代码

#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;
}

我也认为这段代码中有很多无效的部分,如果有人能将代码修复为有效的部分并加快进程,我将不胜感激

【问题讨论】:

  • ` c[i] += b[j] * a[j][i]` 遍历你想要做的第一个索引是不友好的缓存 ` c[i] += b[ j] * a[i][j]`。无论如何,即使你做对了,它也会受到内存带宽的限制。

标签: c openmp matrix-multiplication


【解决方案1】:

我警告你,我最近试图做一个类似的事情(矩阵乘法),但我没有得到我希望的结果:我用两个内核和超线程运行我的程序,并且相对于线性实现的加速非常好很少,只使用非常大的矩阵。使用小尺寸的矩阵,你只会因为线程开销而减慢你的算法。

您可以使用collapse(n) 语句。线程应用于嵌套循环。你应该减少你的开销。可以在此处找到 OpenMP 指令的快速概览(也可折叠):http://bisqwit.iki.fi/story/howto/openmp/

你可以查看我在这里写的代码:http://pastebin.com/edi4DgrJ 您可以在编译时定义矩阵的大小。只需更改定义即可。

您还可以使用“压缩”OpenMP 指令(如parallel for)来加快您的编程会话(我还认为代码的可读性更好)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2021-12-04
    • 2013-05-18
    • 1970-01-01
    相关资源
    最近更新 更多