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

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

[复制链接]
 楼主| 发表于 2008-4-12 14:10:43 | 显示全部楼层
#include <stdio.h>
#include <windows.h>

#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-4-20 18:51 , Processed in 0.050972 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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