找回密码
 欢迎注册
楼主: 无心人

[擂台] 二进制倒序数算法

[复制链接]
 楼主| 发表于 2008-4-12 14:10:43 | 显示全部楼层
#include #include #define TestCount 100000000 __declspec (naked) DWORD __fastcall bitInv(DWORD b, DWORD n) { __asm { bswap ecx mov eax, ecx and ecx, 0x55555555 and eax, 0xAAAAAAAA shl ecx, 1 shr eax, 1 or ecx, eax mov eax, ecx and ecx, 0x33333333 and eax, 0xCCCCCCCC shl ecx, 2 shr eax, 2 or ecx, eax mov eax, ecx and ecx, 0x0F0F0F0F and eax, 0xF0F0F0F0 shl ecx, 4 shr eax, 4 or eax, ecx mov ecx, 32 sub ecx, edx shr eax, cl ret } } int main(void) { UINT64 s_u64Frequency = 1; UINT64 s_u64Start, s_u64End; unsigned long i, TestSize; SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); QueryPerformanceFrequency((LARGE_INTEGER *)&s_u64Frequency ); QueryPerformanceCounter((LARGE_INTEGER *)&s_u64Start ); for (i = 0; i < TestCount; i ++) bitInv(0x12345678, 31); QueryPerformanceCounter((LARGE_INTEGER *)&s_u64End ); printf( "bitInv Elapsed time: %.3f ms\n", (double)(( s_u64End - s_u64Start ) * 1000.0 / (double)s_u64Frequency )); return 0; } //调试好了 //1050ms/1亿次 //全使用逻辑指令为1750ms //证明BSWAP有很好效果 合21时钟/次 感觉有极大的优化余地
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-4-12 14:35:25 | 显示全部楼层
悲哀的发现11楼代码非并行度大,按依赖度,执行组数达15之多 加函数调用开销,优化余地为零! 除非另外的编码思路 ====================== 查表法失效,并未发现比直接计算快 可能卡在内存读取上
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-4-12 21:50:06 | 显示全部楼层
哎 这个问题基本上就到这个地步了 难道要用64k表?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-4-13 13:38:32 | 显示全部楼层
若函数 bitInv(DWORD b, DWORD n) 返回 n为二进制数的b的倒序值,则求bitInv(b+1,n)可在 bitInv(DWORD b, DWORD n) 的基础上快速求出。实际应用中,很少单独求bitInv(b,n),而是求 b (b>0, b<2^n)所有的倒序。至于使用递推算法求所有b的算法,我现在手中没有资料,容后补上。 另外,该部分代码所占的时间相比整个FFT或者NTT所占的时间,.比例并不大.故窃以为这部分代码无需使用汇编优化。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-4-13 14:07:36 | 显示全部楼层
呵呵 不汇编化的时间是汇编后的5倍啊
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-11-21 21:08 , Processed in 0.021172 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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