找回密码
 欢迎注册
查看: 8834|回复: 5

[求助] 问个CPU指令的问题

[复制链接]
发表于 2008-4-3 14:59:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
做内存清零函数的优化 两个函数 一个movdqa, 一个movntdq 数据尺寸(双字串长)小时第一个好,数据尺寸大时第二个好 在尺寸为135000-136000范围开始第二个函数表现开始好于一 (纳闷的是不是512k/4=131072) 二级缓存是512k 一级缓存是8k 请问如何切分分界点 //应该总假定是双字串 void AsmMemZero0(unsigned long * p, unsigned long t) { __asm { xor eax, eax cld mov edi, dword ptr [p] mov edx, t test edx, 0xFFFFFFFF je exit0 test edi, 15 //是否16字节对齐 je AsmZero1 mov ecx, edi and ecx, 0xFFFFFFF0 add ecx, 16 sub ecx, edi //得到需要双字复制部分,要和edx比较谁大 shr ecx, 2 //转换为双字长度 mov ebx, ecx cmp ecx, edx ja AsmZero2 //不足,转尾处理 AsmZero01: mov dword ptr [edi], eax add edi, 4 sub ecx, 1 jne AsmZero01 sub edx, ebx je exit0 //是否刚好 AsmZero1: //16字节对齐 mov ecx, edx shr ecx, 2 je AsmZero2 //是否不足16字节 pxor xmm0, xmm0 AsmZero11: movdqa [edi], xmm0 add edi, 16 sub ecx, 1 jne AsmZero11 AsmZero2: mov ecx, edx and ecx, 3 //得到剩余的双字数 je exit0 AsmZero3: mov dword ptr [edi], eax add edi, 4 sub ecx, 1 jne AsmZero3 exit0: } } //应该总假定是双字串 void AsmMemZero1(unsigned long * p, unsigned long t) { __asm { xor eax, eax cld mov edi, dword ptr [p] mov edx, t test edx, 0xFFFFFFFF je exit0 test edi, 15 //是否16字节对齐 je AsmZero1 mov ecx, edi and ecx, 0xFFFFFFF0 add ecx, 16 sub ecx, edi //得到需要双字复制部分,要和edx比较谁大 shr ecx, 2 //转换为双字长度 mov ebx, ecx cmp ecx, edx ja AsmZero2 //不足,转尾处理 AsmZero01: mov dword ptr [edi], eax add edi, 4 sub ecx, 1 jne AsmZero01 sub edx, ebx je exit0 //是否刚好 AsmZero1: //16字节对齐 mov ecx, edx shr ecx, 2 je AsmZero2 //是否不足16字节 pxor xmm0, xmm0 AsmZero11: movntdq [edi], xmm0 add edi, 16 sub ecx, 1 jne AsmZero11 AsmZero2: mov ecx, edx and ecx, 3 je exit0 AsmZero3: mov dword ptr [edi], eax add edi, 4 sub ecx, 1 jne AsmZero3 exit0: sfence } } [ 本帖最后由 无心人 于 2008-5-6 07:55 编辑 ]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-4-3 19:59:21 | 显示全部楼层
有人对这个东西了解么?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-5-5 22:03:20 | 显示全部楼层
我在测试 AsmMemZero0 函数的性能时发现,1# 的 AsmMemZero0 的函数有bug, 例如当要求对260个DWORD清零时,实际却对264个DWORD清零,请无心人 将bug改正,明天我将给出我写的4个清空函数 和 AsmMemZero0 的性能对比。 by the way,无心人总是很忙,对自己写的程序很少有时间做测试。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-5-6 07:55:23 | 显示全部楼层
不是啊 是基本上 这个还没考虑测试 仅为了测试性能 ============== 真不好意思 改好了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-5-6 10:35:00 | 显示全部楼层
写大数库是个很麻烦的话,运行结果不直观,如果不做单元测试,很难保证正确性。 现在我写每一个函数,都要写测试代码,测试代码分两种,一种对其正确性进行测试,另一种对其速度进行测试。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-5-6 17:24:19 | 显示全部楼层
等你测试结果呢 最好能找到边界 我说过,边界可能稍微大于L2的尺寸
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-12-27 20:44 , Processed in 0.023366 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表