通过向量 OpenMP C 进行矩阵乘法 [重复]

2024-02-18

我正在尝试用 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(使用前将#替换为@)

通过向量 OpenMP C 进行矩阵乘法 [重复] 的相关文章

随机推荐

  • Primefaces上传,如何在高级模式下只允许一次上传

    我想知道是否可以通过使用 primefaces 提前上传模式来限制用户仅上传一个文件 目前我有
  • WPF:当 MVVM 绑定属性更改时激活触发器

    不知怎的 我在这里兜圈子 如果这个问题的答案是显而易见的 请原谅我 我想对视图中 ViewModel 中更改的属性做出反应 当属性 bool 更改时 视图应该启动动画 BeginStoryBoard 实际上 在我的应用程序中 有 4 个这样
  • 如何向 sql 视图添加主键? - 或者将视图链接到 LINQ-2-Entities 的替代方法

    我正在 或尝试 向我的实体对象模型添加一个非常简单的视图 数据库位于 SQL Server 2008 中 我使用 C 在 Net 3 5 SP1 上 该视图有两个字段 color 和 colorcount 分别是 Varchar 50 和
  • jstree中如何回滚无法移动的节点

    我试图弄清楚如何仅回滚未成功移动的文件夹节点 下面的代码是我正在尝试做的事情的示例 当您选择了几个文件夹并将它们移动到另一个文件夹中时 就会出现问题 如果其中一个目录无法移动 我希望能够将其回滚到其原始父目录 很遗憾 jstree roll
  • 在捆绑 NSBundle 中找不到名为“MainStoryBoard”的故事板

    几天前我开始了一个新的应用程序 并开始使用模拟器来测试它 我从一个空项目开始并手动添加故事板 模拟器构建并运行我的应用程序一切正常 但当我尝试构建到我的 iPhone 上时 我收到消息 在捆绑 NSBundle 中找不到名为 MainSto
  • Python 杀死线程

    我正在尝试杀死 python 中的一个线程 异常将是执行此操作的首选方法 因为通过 try except 对优雅地退出线程的 run 方法将允许关闭资源 我试过 Python 有没有办法杀死一个线程 https stackoverflow
  • Inline::Perl5 的列表返回给出项目的计数,而不是列表

    一些简单的 Inline Perl5 代码返回一个列表 但它似乎返回项目的计数而不是实际的列表 更改涉及的项目数量会更改计数 use Inline Perl5 my p5 Inline Perl5 new my perl5 code q t
  • Mathematica:如何防止对 In[-1] 求值?

    当我尝试在 Wolfram 中获取最后一个输入表达式时数学5 2 使用In 1 我得到评估输出 In 1 On In 2 2 In 1 Out 2 4 During evaluation of In 1 In trace In 1 gt I
  • 使用 WebClient 以适当的扩展名保存图像

    我需要从网站检索图像并将其保存到本地文件夹 图像类型有 png jpg 和 gif 我尝试过使用 string url http redsox tcs auckland ac nz CSS CSService svc string save
  • 无法在插件 org.springframework.boot:spring-boot-maven-plugin:1.1.4.RELEASE 中找到目标 '' 在可用目标重新打包中

    我昨天在 eclipse 中运行了一个 spring 应用程序 我有 Windows 7 我今天通过命令提示符运行了它 使用以下命令 mvn spring boot run 这次没有成功 我收到了消息 Could not find goal
  • 如何区分 malloc 字符串和字符串文字?

    有没有一种方法 在纯C中 来区分malloc从字符串文字中提取字符串 而不知道哪个是哪个 严格来说 我试图找到一种方法来检查变量是否是 malloced 字符串 如果是 我将释放它 如果没有 我就放手 当然 我可以向后挖掘代码并确定变量是否
  • 方法到底什么时候会产生副作用?

    正如我一直理解的那样 对程序状态的任何更改 或与 IO 有关的任何事情 都是副作用 更改是发生在全局变量中还是发生在调用该方法的对象的私有字段中并不重要 由此可见 所有不返回任何内容的方法要么根本不执行任何操作 要么有副作用 我的困惑来自于
  • 通过网页发送 Outlook 电子邮件

    我有一个使用 ASP net 和 C 开发的 Web 应用程序 该应用程序在我公司的 Intranet 上运行 由于该应用程序的所有用户无一例外都使用 Microsoft Outlook 因此我希望该应用程序能够在客户端打开 Outlook
  • 垃圾引用和悬空引用有什么区别?

    垃圾引用和悬空引用有什么区别 悬空引用是对不再存在的对象的引用 垃圾是无法通过引用到达的对象 垃圾收集语言中不存在悬空引用 因为对象仅在不再可访问时才会被回收 仅收集垃圾 在某些语言或框架中 您可以使用 弱引用 它可以悬空 因为在收集过程中
  • 如何允许 https 网站上的 iframe 内包含 http 内容

    我将一些 HTML 加载到 iframe 中 但是当引用的文件使用 http 而不是 https 时 出现以下错误 已阻止 current page name 处的页面运行来自 referenced filename 的不安全内容 有什么方
  • JavaScript“未定义”与“void 0”

    到底有什么区别undefined and void 0 哪个是首选 为什么 不同之处在于 某些浏览器允许您覆盖undefined 然而 void anything总是返回真实值不明确的 function undefined undefine
  • 如何将react-hook-form与ant design或material UI一起使用

    我正在尝试使用react hook form库来验证表单 当我使用 ant design 或 Material UI 渲染视图时 它无法正常工作
  • html 中包含大量脚本标记是否会产生性能问题?

    在 html 文件中包含大量 例如 50 个 脚本标记是否存在任何问题 它是否会导致页面渲染时间出现任何性能问题 我的页面上有一个部分 用于提取地理位置点并将其放入数组中以在谷歌地图上使用 我可以仅针对地理位置点创建一个单独的查询 但我相信
  • 扩展“通用”TypeScript 接口

    考虑以下 TS 定义 type GenericPropsWithChildren
  • 通过向量 OpenMP C 进行矩阵乘法 [重复]

    这个问题在这里已经有答案了 我正在尝试用 C OpenMP 通过向量乘法编写矩阵 但是当我添加处理器时我的程序会变慢 1 proc 1 3 s 2 proc 2 6 s 4 proc 5 47 s 我在我的电脑 核心 i5 和我们学校的集群