c语言 f8x16,用x64汇编语言编写384位无符号整数乘法(下)

三、测试与总结

1、用C语言编写一个自测程序test1.c

#include 

#include 

#include 

#include 

#include 

#include "mul384.h"

int main(int argc, char *argv[])

{

uint64_t        a[6], b[6], c[12], i;

//初始化数据

a[5] = 0xEEEEEEEEEEEEEEEE;

a[4] = 0xCCCCCCCCCCCCCCCC;

a[3] = 0xCD8964545891EBC5;

a[2] = 0xF8F0D7E9F7D5C30A;

a[1] = 0x3E7EB0B141E265DC;

a[0] = 0xC459138BCE6E7F2D;

b[5] = 0xCD8964545891EBC5;

b[4] = 0xF8F0D7E9F7D5C30A;

b[3] = 0x3E7EB0B141E265DC;

b[2] = 0xC459138BCE6E7F2D;

b[1] = 0xEEEEEEEEEEEEEEEE;

b[0] = 0xCCCCCCCCCCCCCCCC;

//整数乘法运算

for(i = 0; i 

//结果输出

printf("%016lx%016lx%016lx%016lx\n", c[11], c[10], c[9], c[8]);

printf("%016lx%016lx%016lx%016lx\n", c[7], c[6], c[5], c[4]);

printf("%016lx%016lx%016lx%016lx\n", c[3], c[2], c[1], c[0]);

exit(EXIT_SUCCESS);

}

编译并运行:

gcc -Wall -O2 test1.c mul384.s -o test1

time ./test1

bfd590d741994274668a339bec91ebef2acb6a25db704d7c7fe4faabc9b8246b

687462a249cfed730f66a066ce6f3c5d3b1a0c40603abeb865aaafee147c0410

c086d7bc4c82ac9e655392a75eef149809285ef9273c26162fb8bd29c14133dc

real    0m7.524s

user    0m7.520s

sys    0m0.003s

2、调用用GMP运算库编写对比测试程序test2.c

#include 

#include 

#include 

#include 

#include 

#include 

int main(int argc, char *argv[])

{

mpz_t    a, b, c;

int    i = 0;

//初始化内存

mpz_init2(a, 384);

mpz_init2(b, 384);

mpz_init2(c, 768);

//初始化数据

mpz_init_set_str(a, "EEEEEEEEEEEEEEEE"

"CCCCCCCCCCCCCCCC"

"CD8964545891EBC5"

"F8F0D7E9F7D5C30A"

"3E7EB0B141E265DC"

"C459138BCE6E7F2D", 16);

mpz_init_set_str(b, "CD8964545891EBC5"

"F8F0D7E9F7D5C30A"

"3E7EB0B141E265DC"

"C459138BCE6E7F2D"

"EEEEEEEEEEEEEEEE"

"CCCCCCCCCCCCCCCC", 16);

//整数乘法运算

for(i = 0; i 

//结果输出

mpz_out_str(stdout, 16, c);

fprintf(stdout, "\r\n");

//释放内存

mpz_clear(a);

mpz_clear(b);

mpz_clear(c);

exit(EXIT_SUCCESS);

}

编译并运行(为了照顾阅读,我把test2的输出复制到博文后折行了)

gcc -Wall -O2 test2.c -lgmp -o test2

time ./test2

bfd590d741994274668a339bec91ebef2acb6a25db704d7c7fe4faabc9b8246b

687462a249cfed730f66a066ce6f3c5d3b1a0c40603abeb865aaafee147c0410

c086d7bc4c82ac9e655392a75eef149809285ef9273c26162fb8bd29c14133dc

real    0m9.518s

user    0m9.517s

sys    0m0.001s

编程测试相关操作系统以及平台信息(cpuinfo信息折行显示)

uname -a

2.6.32-504.8.1.el6.x86_64 #1 SMP Wed Jan 28 21:11:36 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

cat /proc/cpuinfo

processor    : 0

vendor_id    : GenuineIntel

cpu family    : 6

model        : 37

model name    : Intel(R) Core(TM) i3 CPU       M 370  @ 2.40GHz

stepping    : 5

microcode    : 4

cpu MHz        : 933.000

cache size    : 3072 KB

physical id    : 0

siblings    : 4

core id        : 0

cpu cores    : 2

apicid        : 0

initial apicid    : 0

fpu        : yes

fpu_exception    : yes

cpuid level    : 11

wp        : yes

flags        : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36

clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm

constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf

pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2

popcnt lahf_lm arat dts tpr_shadow vnmi flexpriority ept vpid

bogomips    : 4787.92

clflush size    : 64

cache_alignment    : 64

address sizes    : 36 bits physical, 48 bits virtual

3、全文小结

对比输出数据和程序运行时间,可以初步肯定这个384位乘法的x64汇编程序的编写成果。对于追求极限速度和代码精简的场合来说,这个汇编小程序有它独到的价值。当然,它的缺点与优点一样突出:

优点:高速、小巧、独立、线程安全、可重入、运算过程无内访问。

缺点:CPU限制(必须支持SSE42),平台限制(必须是基于AMD64 ABI的操作系统),用户态限制(不能用于内核态),16字节对齐限制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值