- 注册时间
- 2007-12-28
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 12769
- 在线时间
- 小时
|
发表于 2008-3-31 13:15:02
|
显示全部楼层
寄存器不足就得使用RAM了,其实,如果这个问题改为 256bit × 256bit,所有的版本都会遇到寄存器不足的问题。
下面是一个完全不使用 任何MMX,SSE,SSE2指令的版本,共102条指令。 在我的电脑上进行测试,结果表明,除了76楼(fixed bug后为96楼)的程序,比这个程序快2倍以上以外,其他的版本 的加速程度 都无法达到2倍。
先贴出测试结果。
Test function: UInt128x128To256_ANSI_C32(..) 10000000 times...
Elapsed time: 1905.637 ms
EAAC506E 17E8573A 5A8A540B ACAE5D9E * C30C395E 93C433B8 4AC06050 7E9A50E8
= B2CC75EE B201F29B 1CDA40BB 312C399D A214AF3C 4BD8278E D1BC04E3 10523730
Test function: UInt128x128To256_SSE2_40F(..) 10000000 times...
Elapsed time: 706.421 ms
EAAC506E 17E8573A 5A8A540B ACAE5D9E * C30C395E 93C433B8 4AC06050 7E9A50E8
= B2CC75EE B201F29B 1CDA40BB 312C399D A214AF3C 4BD8278E D1BC04E3 10523730
Test function: UInt128x128To256_SSE2_42F(..) 10000000 times...
Elapsed time: 729.128 ms
EAAC506E 17E8573A 5A8A540B ACAE5D9E * C30C395E 93C433B8 4AC06050 7E9A50E8
= B2CC75EE B201F29B 1CDA40BB 312C399D A214AF3C 4BD8278E D1BC04E3 10523730
Test function: UInt128x128To256_SSE2_54F(..) 10000000 times...
Elapsed time: 695.204 ms
EAAC506E 17E8573A 5A8A540B ACAE5D9E * C30C395E 93C433B8 4AC06050 7E9A50E8
= B2CC75EE B201F29B 1CDA40BB 312C399D A214AF3C 4BD8278E D1BC04E3 10523730
Test function: UInt128x128To256_SSE2_56F(..) 10000000 times...
Elapsed time: 580.515 ms
EAAC506E 17E8573A 5A8A540B ACAE5D9E * C30C395E 93C433B8 4AC06050 7E9A50E8
= B2CC75EE B201F29B 1CDA40BB 312C399D A214AF3C 4BD8278E D1BC04E3 10523730
Test function: UInt128x128To256_SSE2_58F(..) 10000000 times...
Elapsed time: 880.662 ms
EAAC506E 17E8573A 5A8A540B ACAE5D9E * C30C395E 93C433B8 4AC06050 7E9A50E8
= B2CC75EE B201F29B 1CDA40BB 312C399D A214AF3C 4BD8278E D1BC04E3 10523730
Test function: UInt128x128To256_SSE2_69F(..) 10000000 times...
Elapsed time: 834.156 ms
EAAC506E 17E8573A 5A8A540B ACAE5D9E * C30C395E 93C433B8 4AC06050 7E9A50E8
= B2CC75EE B201F29B 1CDA40BB 312C399D A214AF3C 4BD8278E D1BC04E3 10523730
Test function: UInt128x128To256_SSE2_94F(..) 10000000 times...
Elapsed time: 864.124 ms
EAAC506E 17E8573A 5A8A540B ACAE5D9E * C30C395E 93C433B8 4AC06050 7E9A50E8
= B2CC75EE B201F29B 1CDA40BB 312C399D A214AF3C 4BD8278E D1BC04E3 10523730
Test function: UInt128x128To256_SSE2_96F(..) 10000000 times...
Elapsed time: 403.787 ms
EAAC506E 17E8573A 5A8A540B ACAE5D9E * C30C395E 93C433B8 4AC06050 7E9A50E8
= B2CC75EE B201F29B 1CDA40BB 312C399D A214AF3C 4BD8278E D1BC04E3 10523730
Test function: UInt128x128To256_ALU_102F(..) 10000000 times...
Elapsed time: 945.073 ms
EAAC506E 17E8573A 5A8A540B ACAE5D9E * C30C395E 93C433B8 4AC06050 7E9A50E8
= B2CC75EE B201F29B 1CDA40BB 312C399D A214AF3C 4BD8278E D1BC04E3 10523730
再贴出完整的代码.- _declspec(naked)
- void UInt128x128To256_ALU_102F( UINT32 * const result,
- const UINT32 * const left,
- const UINT32 * const right )
-
- {
- #undef LEFT_REG
- #undef RIGHT_REG
- #undef RESULT_REG
-
- #define LEFT_REG esi
- #define RIGHT_REG edi
- #define RESULT_REG ebp
-
- __asm
- {
- push esi
- push edi
- push ebx
- push ebp
-
-
- mov RIGHT_REG, dword ptr[esp + 0Ch+16] ; right
- mov LEFT_REG, dword ptr [esp + 08h+16] ; left
- mov RESULT_REG, dword ptr[esp + 04h+16] ; result
- xor ebx, ebx
- xor ecx, ecx
-
- // result[0],一次乘法
- mov eax,dword ptr [LEFT_REG]
- mul dword ptr [RIGHT_REG]
- mov dword ptr [RESULT_REG], eax
- mov dword ptr [RESULT_REG+4], edx
-
-
- // result[1],2次乘法
- mov eax,dword ptr [LEFT_REG]
- mul dword ptr [RIGHT_REG+4]
- add dword ptr [RESULT_REG+4], eax
- adc ecx, edx
- adc ebx,0
-
- mov eax,dword ptr [LEFT_REG+4]
- mul dword ptr [RIGHT_REG]
- add dword ptr [RESULT_REG+4], eax
- adc ecx, edx
- adc ebx,0
-
- mov dword ptr [RESULT_REG+8], ecx
- mov ecx, ebx
-
-
- // result[2], 3 次乘法
- xor ebx, ebx
- mov eax,dword ptr [LEFT_REG]
- mul dword ptr [RIGHT_REG+8]
- add dword ptr [RESULT_REG+8], eax
- adc ecx,edx
- adc ebx,0
-
- mov eax,dword ptr [LEFT_REG+4]
- mul dword ptr [RIGHT_REG+4]
- add dword ptr [RESULT_REG+8], eax
- adc ecx, edx
- adc ebx,0
-
- mov eax,dword ptr [LEFT_REG+8]
- mul dword ptr [RIGHT_REG+0]
- add dword ptr [RESULT_REG+8], eax
- adc ecx, edx
- adc ebx,0
-
- mov dword ptr [RESULT_REG+12], ecx
- mov ecx, ebx
-
-
- // result[3],4次乘法
- xor ebx, ebx
- mov eax,dword ptr [LEFT_REG+0]
- mul dword ptr [RIGHT_REG+12]
- add dword ptr [RESULT_REG+12], eax
- adc ecx, edx
- adc ebx,0
-
- mov eax,dword ptr [LEFT_REG+4]
- mul dword ptr [RIGHT_REG+8]
- add dword ptr [RESULT_REG+12], eax
- adc ecx, edx
- adc ebx,0
-
- mov eax,dword ptr [LEFT_REG+8]
- mul dword ptr [RIGHT_REG+4]
- add dword ptr [RESULT_REG+12], eax
- adc ecx, edx
- adc ebx,0
-
-
- mov eax,dword ptr [LEFT_REG+12]
- mul dword ptr [RIGHT_REG+0]
- add dword ptr [RESULT_REG+12], eax
- adc ecx, edx
- adc ebx,0
-
- mov dword ptr [RESULT_REG+16], ecx
- mov ecx, ebx
-
-
- // result[4],3次乘法
- xor ebx, ebx
- mov eax,dword ptr [LEFT_REG+4]
- mul dword ptr [RIGHT_REG+12]
- add dword ptr [RESULT_REG+16], eax
- adc ecx, edx
- adc ebx,0
-
- mov eax,dword ptr [LEFT_REG+8]
- mul dword ptr [RIGHT_REG+8]
- add dword ptr [RESULT_REG+16], eax
- adc ecx, edx
- adc ebx,0
-
- mov eax,dword ptr [LEFT_REG+12]
- mul dword ptr [RIGHT_REG+4]
- add dword ptr [RESULT_REG+16], eax
- adc ecx, edx
- adc ebx,0
- mov dword ptr [RESULT_REG+20], ecx
- mov ecx, ebx
-
-
- // result[5],2次乘法
- xor ebx, ebx
- mov eax,dword ptr [LEFT_REG+8]
- mul dword ptr [RIGHT_REG+12]
- add dword ptr [RESULT_REG+20], eax
- adc ecx, edx
- adc ebx,0
-
- mov eax,dword ptr [LEFT_REG+12]
- mul dword ptr [RIGHT_REG+8]
- add dword ptr [RESULT_REG+20], eax
- adc ecx, edx
- adc ebx,0
-
-
- // result[6,7],1次乘法
- mov eax,dword ptr [LEFT_REG+12]
- mul dword ptr [RIGHT_REG+12]
- add ecx, eax
- adc ebx,edx
-
- mov dword ptr [RESULT_REG+24], ecx
- mov dword ptr [RESULT_REG+28], ebx
-
-
- pop ebp
- pop ebx
- pop edi
- pop esi
-
- ret
- }
- }
复制代码 |
|