我迫切需要时间来优化大量的C代码以提高速度,我正在寻找一种算法-最好是C"代码段"-可以转换任意大小的矩形源矩阵u[r](行数,c列数)放入目标矩阵v▼显示[d](s = c行数,d = r列数)中的"缓存友好" i。 e。数据局部性尊重方式。 u的典型大小约为5000 ... 15000行乘50到500列,并且很显然,元素的按行访问是非常低效的缓存。

网络上有很多关于此主题的讨论(在该线程附近),但据我所知,他们都在讨论空间情况,例如方阵u[r][r]或维数组的定义,例如e。 G。 u[r * c],而不是在我的数字食谱上下文中使用的上述"数组数组"(长度相等)(背景请参见此处)。

非常感谢我能为我省去"重塑方向盘"的任何暗示。

马丁

如果两个源元素彼此靠近,则相应的目标元素将彼此远离,反之亦然。如何可能希望进行缓存友好的转换?我真的很好奇。

找到了我不太明白它是如何工作的...

这个问题是对资源或信息的需求。所以不是那个地方。尝试进行学术问答:例如,计算机科学。

实际上,我尝试了一种可以忽略缓存的转置的简单实现,与nave方法相比,其速度提高了10倍。

@ n.m。关键在于利用高速缓存行具有固定大小这一事实。可以说正在处理float。即使您从左上到右下依次遍历源矩阵,即使每16列遍历矩阵的一行(假设有64字节的高速缓存行),也会出现初始强制缺失。

@ n.m。结果,从单行访问第16列条目的费用(从简化的L1缓存角度来看)与访问下一行的第一列条目的费用一样昂贵。我们倾向于以一个巨大的连续块来考虑空间局部性,但是它仅在L1高速缓存的情况下(例如,给定高速缓存行的大小)才有意义。

@ n.m。现在,您便可以开始理解,您可以开始在矩阵上平铺遍历以在输入矩阵上以较短的水平跨度进行遍历,同时在逐出之前使用高速缓存行中的所有数据,同时通过缩短时间来实现时间局部性。垂直跨度遍历输出矩阵。这样,涉及输出矩阵的垂直平铺步幅就需要较少的高速缓存行,而通过使用较短的水平平铺跨度来使输入变得更糟。

@Ike是的,现在明白了,事后看来很明显。

我不认为一般而言,数组数组比线性数组更难转置。但是,如果每个数组中要有50列,这听起来很糟糕:可能不足以隐藏指针解引用的开销。

我认为缓存友好实现的总体策略是相同的:在图块中处理矩阵,根据实验选择效果最好的图块大小。

template

void TransposeBlocked(Matrix &dst, const Matrix &src) {

int r = dst.r, c = dst.c;

assert(r == src.c && c == src.r);

for (int i = 0; i < r; i += BLOCK)

for (int j = 0; j < c; j += BLOCK) {

if (i + BLOCK <= r && j + BLOCK <= c)

ProcessFullBlock(dst.data, src.data, i, j);

else

ProcessPartialBlock(dst.data, src.data, r, c, i, j, BLOCK);

}

}

我尝试优化当r = 10000,c = 500(使用float类型)时的最佳情况。在我的本地计算机上,128 x 128瓦片的速度提高了2.5倍。另外,我尝试使用SSE来加速换位,但是它不会显着改变时序。我认为这是因为问题是内存限制。

以下是Core2 E4700 2.6GHz上各种实现的完整时序(每个时序100次):

Trivial: 6.111 sec

Blocked(4): 8.370 sec

Blocked(16): 3.934 sec

Blocked(64): 2.604 sec

Blocked(128): 2.441 sec

Blocked(256): 2.266 sec

BlockedSSE(16): 4.158 sec

BlockedSSE(64): 2.604 sec

BlockedSSE(128): 2.245 sec

BlockedSSE(256): 2.036 sec

这是使用的完整代码。

所以,我猜你有一个浮点数/双精度数的数组。此设置对于缓存性能而言已经非常糟糕。原因是使用一维数组时,编译器可以输出导致预取操作的代码,并且(对于非常新的编译器而言)可以生成SIMD /矢量化的代码。有了指针数组,每个步骤都有一个引用操作,使预取更加困难。更不用说对内存对齐没有任何保证。

如果这是一项任务,您别无选择,只能从头开始编写代码,那么我建议您看一下CBLAS的工作方式(请注意,您仍然需要将数组"展平")。否则,使用高度优化的BLAS实现(例如,

OpenBLAS。它已经进行了近十年的优化,它将为您的目标处理器生成最快的代码(调整缓存大小和向量指令集之类的东西)。

tl; dr是使用数组数组无论如何都会导致糟糕的性能。通过使用#define访问数组的元素来展平数组并使代码易于阅读。

矩形换位算法C语言实现,关于C#:任意大小的矩形矩阵的运行时有效换位相关推荐

  1. c语言字符串非对称加密,RSA算法C语言实现(支持任意位密钥)

    之前分享过三种常用MD5.SHA2和AES加密算法(点这里)实现源码,前三者分别属于哈希加密和对称加密,而另一种很常用的非对称加密RSA算法实现这次分享出来.RSA算法的原理和用途大家可以网上自行搜索 ...

  2. 对Eclipse OMR(用于创建语言运行时环境的工具集)架构师Mark Stoodley的访谈

    IBM的Eclipse OMR是一个开源的虚拟机工具集,用于创建任意语言的运行时环境.它的意图在于让实现语言的人能够重用IBM在Java运行时方面所投入的数百开发人年所取得的成果,能够受益的包含已有的 ...

  3. 古典密码算法实验c语言,2021信息安全 实验一 古典密码算法C语言.docx

    2021信息安全 实验一 古典密码算法C语言.docx 信息安全信息安全 实验一实验一 古典密码算法古典密码算法 C C 语言语言 信息安全实验报告 课程名称 _ 专业计算机科学与技术 _2010_级 ...

  4. 【算法】逻辑题算法题语言特性(集合贴1)

    为什么80%的码农都做不了架构师?>>>    BX网Email过来的安卓笔试题 1.商品摆放问题 在网上搜了下,最多的是基于Aprior算法的解决方案,还搜到论坛帖子,里面有人说这 ...

  5. c语言贝叶斯分类,基于朴素贝叶斯分类器的文本分类算法(C语言)

    基于朴素贝叶斯分类器的文本分类算法(C语言) 基于朴素贝叶斯分类器的文本分类算法(C语言).txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情.#include ...

  6. R语言ggplot2可视化、在可视化区域中自定义添加多个大小不同矩形阴影区域、自定义配置大小不同矩形阴影区域的颜色(Adding multiple shadows/rectangles)

    R语言ggplot2可视化.在可视化区域中自定义添加多个大小不同矩形阴影区域.自定义配置大小不同矩形阴影区域的颜色(Adding multiple shadows/rectangles) 目录

  7. 《数据结构与算法 C语言版》—— 3.8习题

    本节书摘来自华章出版社<数据结构与算法 C语言版>一 书中的第3章,第3.8节,作者:徐凤生,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 3.8习题 1名 ...

  8. 《数据结构与算法 C语言版》—— 2.5上机实验

    本节书摘来自华章出版社<数据结构与算法 C语言版>一 书中的第2章,第2.5节,作者:徐凤生,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.5上机实验 实 ...

  9. 《数据结构与算法 C语言版》—— 2.7习题

    本节书摘来自华章出版社<数据结构与算法 C语言版>一 书中的第2章,第2.7节,作者:徐凤生,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.7习题 1描 ...

最新文章

  1. python爬虫教程网-python爬虫入门10分钟爬取一个网站
  2. HTML数字自动排序,jquery – HTML中的数字嵌套排序列表
  3. 04-CA/TA编程:hash demo
  4. how does SAP UI5 filter for list work in xml view
  5. TiKV 源码解析系列 - Raft 的优化
  6. 视频跟踪——CMT算法
  7. 随笔-jsp 利用jstl标签分页
  8. 实战演练:PostgreSQL在线扩容
  9. 【codevs1425】最小的N个和,如何像煞笔一样地写堆
  10. JAVA核心技术_【读】Java核心技术卷1
  11. LibreOffice的使用技巧
  12. 认识与使用计算机 答案,计算机学习感悟—对计算机的认知和理解
  13. android 登录 service_如何优雅的实现自己的Android组件化改造?
  14. 操作系统:磁盘调度实验之扫描和循环扫描调度算法(含源码和文档)
  15. 如何用两个栈实现一个队列
  16. 2020腾讯秋招笔试编程题--压缩算法
  17. Chrome浏览器清除页面js文件缓存的方法
  18. failed creating java jvm.dll
  19. 数据分析项目-大选献金数据分析
  20. cookielifetime php_php中实现精确设置session过期时间的方法

热门文章

  1. 画质增强概述-2-应用场景
  2. c语言预测未来身高的编程源代码,C语言选择结构程序设计编程题
  3. c语言计时纳秒_C语言中常用计时方法总结
  4. 电子商务思维导图精品荟萃:电子商务思维导图大全
  5. Python 自动交替排班
  6. [linux]循序渐进学运维-基础命令篇-文件的归档和压缩
  7. 室内场景数据集 Indoor Scene Recognition
  8. popoupwindow 点击背景消失_海獭能阻止全球变暖?40年后巧克力会因全球变暖而消失?...
  9. 推荐Bandicam(高清录像工具)
  10. 中科院算法试题 陈玉福