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;
有没有办法让我的方法更快?
答案 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}}公开了cuda
(quoting)
mul24.hi执行24x24位乘法并返回高32位 48位结果
据我所知,x86汇编中没有这样的说明。
希望这有帮助。
答案 1 :(得分:0)
像__umulhi()这样的内在函数被设计为在特定体系结构上使用更少/专用指令(这里是Nvidia GPU)。你必须按照评论中的建议(例如CPU的Intel)来查看专有解决方案,而不是期待来自C ++的东西。
在这种情况下,我非常怀疑你会找到一种内在的东西,用任何有意义的性能提升取代你的方法。