通过向量 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 进行矩阵乘法 [重复] 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • 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 和我们学校的集群