免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5132 | 回复: 13
打印 上一主题 下一主题

[算法] 已知内存读写是某个程序最慢的操作,如何减少内存读写? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-01 13:26 |只看该作者 |倒序浏览
本帖最后由 safedead 于 2013-03-01 13:31 编辑

某程序有一个内置数组,大小为256字节
经分析,此程序超过一半的时间消耗在读取这个数组上
现在想优化,该怎么做

static unsigned char sbox[256];

使用此数组的完整代码:
uint32_t apply_sbox(uint32_t  a)
{
    uint32_t  b;
    b = (sbox[a >> 24] << 24)                       \
        ^ (sbox[(a >> 16) & 0xFF] << 16)             \
        ^ (sbox[(a >> 8) & 0xFF] << 8)              \
        ^ sbox[a & 0xFF];
    return b;
}
每计算一次b,就要访问四次数组sbox[],而且大多是非对齐访问,导致此程序超过一半的时间消耗在读取这个数组上
这个sbox数组就是对称密码体系里常说的"S盒",上面的C代码运算模式叫“4路并行S盒”,用FPGA实现比较高效,可以真正做到“4路并行运算”
但是x64下就没这么便利了

首先说明,这个sbox不存在64个系数以下的多项式解,不像AES的sbox是二元扩域椭圆曲线乘法矩阵

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-03-01 13:38 |只看该作者
看起来像是想优化算法的样子.

函数inline, O3优化.{:3_190:}

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
3 [报告]
发表于 2013-03-01 13:51 |只看该作者
请问咋分析出"超过一半的时间消耗在读取这个数组"的啊?
或者是这个函数开销占了一半时间? 理解的像这样频繁访问的内存数据块一般会被cache住啊.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2013-03-01 14:23 |只看该作者
hanxin83 发表于 2013-03-01 13:51
请问咋分析出"超过一半的时间消耗在读取这个数组"的啊?
或者是这个函数开销占了一半时间? 理解的像这样频繁 ...


典型的x64系统
CACHE命中的内存读取大概20个cycle的样子
不在CACHE的内存读取至少100个cycle

3个cycle可以完成一个64bit x 64bit = 128bit乘法
144个cycle可以完成一个X87浮点除法

实际上这个函数是不存在的,整个程序是汇编写的,访问sbox的部分反编译成C代码才是我贴出的函数的样子
整个程序就一个函数,sbox放在BSS段

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2013-03-01 14:37 |只看该作者
本帖最后由 cjaizss 于 2013-03-01 14:38 编辑
safedead 发表于 2013-03-01 13:26
某程序有一个内置数组,大小为256字节
经分析,此程序超过一半的时间消耗在读取这个数组上
现在想优化,该 ...

FPGA也无法跨越硬件的障碍,4路访问还是得有先有后。
哦,明白了你的意思,你不用RAM,只是4个选择器电路

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2013-03-01 14:52 |只看该作者
cjaizss 发表于 2013-03-01 14:37
FPGA也无法跨越硬件的障碍,4路访问还是得有先有后。
哦,明白了你的意思,你不用RAM,只是4个选择器电路


我的笔记本CPU主频2.4G,用x64编程,单进程处理速度440Mbps
同事用ALTERA的FPGA编写专用处理器,50MHz,4级流水线实现,处理速度接近1600Mbps

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2013-03-01 15:26 |只看该作者
safedead 发表于 2013-03-01 14:52
我的笔记本CPU主频2.4G,用x64编程,单进程处理速度440Mbps
同事用ALTERA的FPGA编写专用处理器,50MHz ...

猜测做法是整个公式做成组合电路,然后该组合电路有好多份

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2013-03-01 15:48 |只看该作者
回复 7# cjaizss


   

是的,组合电路消耗的逻辑资源越多速度越快

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
9 [报告]
发表于 2013-03-01 16:34 |只看该作者

static unsigned char sbox[256]
改成
static unsigned int sbox[256]
就能对齐访问了……

论坛徽章:
1
技术图书徽章
日期:2013-09-10 08:57:55
10 [报告]
发表于 2013-03-02 16:55 |只看该作者
非对齐访问,会导致CACHE无效?
那么按照楼上的思路:
  1. typedef struct {
  2.   unsigned char use;
  3.   unsigned char nouse1;
  4.   unsigned char nouse2;
  5.   unsigned char nouse3;
  6. } Cell ;

  7. Cell sbox[256];
复制代码
按4个字节对齐就能够使cache生效?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP