行主与列主矩阵乘法

2023-12-25

我目前正在开发一个 C 程序,尝试计算矩阵乘法。我通过循环第二个矩阵的每一列来完成此任务,如下所示。

我已将大小设置为 1000。

for(i=0;i<size;i++)
{
  for(j=0;j<size;j++)
  {
    for(k=0;k<size;k++)
    {
      matC[i][j]+=matA[i][k]*matB[k][j];
    }
  }
}

我想知道这个实现中存在哪些有问题的访问模式。是什么使行/列访问比其他访问更有效?我试图从使用缓存的逻辑角度来理解这一点。请帮助我理解这一点。非常感谢您的帮助 :)


如果您正在谈论缓存的使用,那么您可能想做一些称为循环平铺的操作。您将循环分解为图块,以便循环的内部部分存储在缓存中(现在缓存相当大)。所以你的循环将变成类似的东西(如果你使用指针将矩阵传递到函数中)

for(j=0;j<size;j+=t)
    for(k=0;k<size;k+=t)
       for(i=0;i<size;i+=t)
          for(ii=i;ii<MIN(i+t,size);ii++)
             for(jj=j;jj<MIN(j+t,size);jj++)
        {       
          var=*(c+ii * size+jj);    //Var is a scalar variable                     
          for(kk=k;kk<MIN(k+t,size);kk++)
              {                      
         var = var + *(a+ii *size +kk) * *(bt +jj * size+ kk);          
              }
          *(c+ii *size +jj) = var;
        }                       

t 的值根据您获得的加速比而变化。它可以 t = 64,128,256 等等。您可以在此处使用许多其他技术。循环平铺只是有效利用缓存的一次技术。此外,您可以在发送到乘法函数之前转置 B 矩阵。这样你就可以线性访问矩阵 B 的元素。更多解释 考虑

          A  --------   and B | | | |
             --------         | | | |
             --------         | | | | 
             --------         | | | |

在这里,您总是会考虑将 A 的第一行与 B 的第一列相乘。并且因为您正在使用C我相信,CPU需要额外的努力才能将矩阵B的所有列一一读入内存中。为了减轻这些工作,您可以转置矩阵并获取矩阵的行B'(它们只不过是B本质上)并使用循环平铺来缓存乘法的最大数量的元素。希望这会有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

行主与列主矩阵乘法 的相关文章

  • 为什么基类必须有一个带有 0 个参数的构造函数?

    这不会编译 namespace Constructor0Args class Base public Base int x class Derived Base class Program static void Main string a
  • 当我单击 C# 中的“取消”按钮时重定向到新页面(Web 部分)

    Cancel button tc new TableCell btnCancel new Button btnCancel Text Cancel btnCancel Click new EventHandler btnCanel Clic
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem

随机推荐

  • JPA:设置参数后,如何获取/打印(类型化)查询后面的 JPQL 查询字符串?

    如何获取 打印 类型化 查询后面的 JPQL 查询字符串 即after参数已设置 例如用于调试目的 一个简单的toString 似乎没有做到这一点 Thanks 不存在 最终被转换为最终 SQL 的最终 JPQL 这样的事情 JPA 实现如
  • AWS RDS 的间歇性 SQL 连接问题

    目前 我们的 ASP NET 网站 基于 Sitecore 构建 遇到间歇性问题 该网站看似随机的 15 分钟内无法连接到 SQL Server 15 分钟后 问题自行解决 网站恢复正常 错误信息是 Exception System Dat
  • SAS proc sql返回group by/order by变量的重复值

    我有一些相当简单的 SQL 应该为每个资产每季度提供 1 行 相反 我每组得到多行 下面是 SQL SAS 数据步骤和一些输出数据 重复行数 在下面的数据中为 227708 等于 Num borrowers 即 asset1 的行数 pro
  • 为什么标签的高度比其内容大?

    我创建了一个小片段来说明问题 我有一个svg里面的图标 i 标签 这是我的图标的基本块 放置在我的页面的各个位置 为了这个示例 我将其放置在一个简单的 div 容器中 如果您检查下面示例的结果 您会发现 i 标签的高度为33px not 3
  • 在 PHP 中,函数是二进制安全的意味着什么?

    In PHP函数是什么意思binary safe 它们有何特别之处 它们通常用在什么地方 这意味着当您向函数传递任意二进制数据 即包含非 ASCII 字节和 或空字节的字符串 时 该函数将正常工作 例如 非二进制安全函数可能基于需要空终止字
  • 在 MongoDB 中执行 JavaScript 文件

    我想知道如何在 MongoDB 中执行 JavaScript 文件 这是我的 JS 文件中的一段简单代码 function loadNames print name 从命令提示符我尝试像这样执行文件 mongo test js 但它显示错误
  • 如何限制Go中实现的HTTP服务器的连接数?

    我正在尝试在 Golang 中实现 HTTP 服务器 我的问题是 我必须将任何特定时间的最大活动连接数限制为 20 您可以使用netutil LimitListener https godoc org golang org x net ne
  • jQuery 滑块作为时间线

    我刚刚完成了 jQuery 手风琴与 jQuery 滑块的合并 IE 显示 3 张图片 用户可以使用PREV or NEXT按钮可查看下一张 上一张 3 张图像 他们还可以使用滑块浏览所有图像 下一步是使这个滑块看起来像时间线 左侧需要从
  • 我应该使用哪个(对于基于 python 的网站)? sass、compass、switchcss...替代品? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 组织 CSS 的最佳系统是什么 我正在制作几个使用 python 作为后端脚本的网站 我有兴趣使用一些东西来帮助我组织长 css 脚本 我
  • 使用 Jackson 反序列化包装列表

    我有一个像这样的 JSON 对象 geonames countryId 2017370 adminCode1 73 countryId 2027370 adminCode1 71 我怎样才能反序列化这个对象DIRECTLY to List
  • 如何在 Spring 应用程序上下文中将 Class 设置为属性值?

    有没有办法配置 spring 应用程序上下文 以便它将使用 Class 类型的值初始化 setter 我需要初始化该结构 Map
  • 将 RTSP 流转换为虚拟网络摄像头

    我正在尝试使用来自 IP 摄像机的 RTSP 流作为 Windows 上各种应用程序 例如 Skype Zoom Microsoft Teams 等 的视频输入源 到目前为止我找到的唯一解决方案是使用 webcam 7 http www w
  • std::weak_ptr:锁或shared_ptr构造函数?

    似乎有两种方法可以暂时获取 a 所指向的资源的所有权weak ptr Use lock 通过weak ptr to a shared ptr构造函数 这两者都会产生一个shared ptr 锁返回一个nullptr在这种情况下weak pt
  • 动态设置线性布局背景

    我想通过以下方式动态设置线性布局背景 通过 XML 解析从 Web url 获取图像 然后将该图像存储到 SD 卡中 现在图像已保存到 SD 卡中 将该图像设置为应用程序中的线性布局背景 现在我陷入了第三步 有人可以帮忙吗 用这个 Bitm
  • 在Thread中使用EnterCriticalSection更新VCL标签

    我是线程新手 我正在使用一个第三方库 该库使用线程 有时会调用我提供的过程 当线程调用我的过程时 如何更新 TLabel Caption 如果我在其他地方调用了InitializeCriticalSection 它是否像 EnterCrit
  • 光源设置不正确

    我有这段代码 但灯光似乎无法正常工作 当我渲染对象时它很暗 然后当我旋转它时 光源似乎也旋转了 我不知道问题出在哪里 我尝试修改灯光模型但仍然不起作用 这是程序 while glfwWindowShouldClose window Rend
  • Javascript递归设置超时

    我刚刚开始研究 javascript 所以希望这会是简单的事情 我想制作自动播放的图像幻灯片 这非常简单 并且有一些关于它的教程 但由于某种原因我无法让它工作 这就是我所拥有的 var image1 new Image var image2
  • WPF列表框滚动到底部

    我使用 ObservableCollection 作为 listBox 组件的 ItemSource 但控件的行为对我来说并不合适 我已经向下滚动到这件事在我的收藏中第一次出现 但不是最后一次 示例列表为 1 1 2 3 4 5 6 7 8
  • XSLT PI 和样式表参数

    给定一个需要参数的 XSLT 1 x 样式表 是否有任何方法可以将其与指定参数值的 XML 文档关联起来 我阅读了样式表 PI 的 W3C 规范文档 并得到了答案是 否 的印象 但当我读完时 我遇到了急性 BNF 中毒的情况 因此可能错过了
  • 行主与列主矩阵乘法

    我目前正在开发一个 C 程序 尝试计算矩阵乘法 我通过循环第二个矩阵的每一列来完成此任务 如下所示 我已将大小设置为 1000 for i 0 i