获得两个无符号整数c ++乘积的高32位的有效方法

时间:2017-06-09 04:54:44

标签: c++ compiler-optimization

unsigned int a = 4294967295;  // (2^32)-1
unsigned int b = 2; 

我试图找出获得两个无符号整数乘积的高32位的最有效方法。 例如,使用CUDA编程我只能unsigned int first32bits = __umulhi(a,b)并获得高32位。

有没有办法在C ++中做这样的事情?

这是我的方法:

unsigned long c = ( ((unsigned long)a * (unsigned long)b ) >> 32) & 0x00000000FFFFFFFF;

有没有办法让我的方法更快?

2 个答案:

答案 0 :(得分:2)

除非有一些架构相关电路将 var myStuff= [ { "YYYY_YEAR" : "2013", "MMM_MONTH" : "06", "DAY_OUT" : { "DAY_OUT_ITEM" : { "N_DAYS" : "06", "CLASSNAME" : "Holiday", "TOOLTIP" : "Lalat Al Miraj" } } }, { "YYYY_YEAR" : "2017", "MMM_MONTH" : "06", "DAY_OUT" : { "DAY_OUT_ITEM" : [ { "N_DAYS" : "06", "CLASSNAME" : "Holiday", "TOOLTIP" : "Lalat Al Miraj" } ] } }, { "YYYY_YEAR" : "2013", "MMM_MONTH" : "01", "DAY_OUT" : { "DAY_OUT_ITEM" : [ { "N_DAYS" : "01", "CLASSNAME" : "Holiday", "TOOLTIP" : "New Year's Day" }, { "N_DAYS" : "24", "CLASSNAME" : "Holiday", "TOOLTIP" : "Milad Un Nabi" } ] } }, { "YYYY_YEAR" : "2017", "MMM_MONTH" : "01", "DAY_OUT" : { "DAY_OUT_ITEM" : [ { "N_DAYS" : "01", "CLASSNAME" : "Holiday", "TOOLTIP" : "New Year's Day" }, { "N_DAYS" : "24", "CLASSNAME" : "Holiday", "TOOLTIP" : "Milad Un Nabi" } ] } }]; Holidays = { 'value': { } } for (var i = 0; i < myStuff.length; i++) { var year = parseInt(myStuff[i].YYYY_YEAR,10); var month = parseInt(myStuff[i].MMM_MONTH,10); if (typeof Holidays['value'][myStuff[i].YYYY_YEAR] == 'undefined') { Holidays['value'][year] = {}; } if (typeof Holidays['value'][year][myStuff[i].MMM_MONTH] == 'undefined') { Holidays['value'][year][month] = {}; } if(myStuff[i].DAY_OUT.DAY_OUT_ITEM instanceof Array) { for (var j = 0; j < myStuff[i].DAY_OUT.DAY_OUT_ITEM.length; j++) { var day=parseInt(myStuff[i].DAY_OUT.DAY_OUT_ITEM[j].N_DAYS,10); Holidays['value'][year][month][day] = { className: myStuff[i].DAY_OUT.DAY_OUT_ITEM[j].CLASSNAME, tooltip: myStuff[i].DAY_OUT.DAY_OUT_ITEM[j].TOOLTIP }; } } else { var day=parseInt(myStuff[i].DAY_OUT.DAY_OUT_ITEM.N_DAYS,10); Holidays['value'][year][month][day] = { className: myStuff[i].DAY_OUT.DAY_OUT_ITEM.CLASSNAME, tooltip: myStuff[i].DAY_OUT.DAY_OUT_ITEM.TOOLTIP }; } } Holidays = { Holidays: Holidays } console.log(JSON.stringify(Holidays.Holidays));映射到本机指令,否则我认为这是你能做的最好的。

查看由imulh32为您的函数生成的程序集,显然只需要g++ 6.3汇编操作,而不仅仅因为1而只执行乘法的函数。< / p>

shr $0x20

unsigned long umulhi32( unsigned int x, unsigned int y) { return ( ((unsigned long)a * (unsigned long)b ) >> 32); } 0000000000000960 <_Z8umulhi32jy>: 960: 89 f8 mov %edi,%eax 962: 89 f7 mov %esi,%edi 964: 48 0f af c7 imul %rdi,%rax 968: 48 c1 e8 20 shr $0x20,%rax 96c: c3 retq 96d: 0f 1f 00 nopl (%rax) 的程序集以便查看它是否映射到某些专用的PTX指令会很有意思,我认为这很可能是因为cuda umulhi程序集使用了PTX程序集。例如,{1}}公开了cudaquoting

  

mul24.hi执行24x24位乘法并返回高32位   48位结果

据我所知,x86汇编中没有这样的说明。

希望这有帮助。

答案 1 :(得分:0)

像__umulhi()这样的内在函数被设计为在特定体系结构上使用更少/专用指令(这里是Nvidia GPU)。你必须按照评论中的建议(例如CPU的Intel)来查看专有解决方案,而不是期待来自C ++的东西。

在这种情况下,我非常怀疑你会找到一种内在的东西,用任何有意义的性能提升取代你的方法。