我正在编写一个用于统计采样的小型库,它需要尽可能快地运行。在分析中,我发现函数中大约 40% 的时间花在计算阶乘对数的斯特林近似值上。我正在将优化工作集中在这一部分上。这是我的代码(使用MPFR):
const double AL[8] =
{ 0.0, 0.0, 0.6931471806, 1.791759469, 3.178053830, 4.787491743,
6.579251212, 8.525161361 };
void HGD::mpfr_afc(mpfr_t &ret, const mpfr_t &val){
if(mpfr_cmp_ui(val, 7) <= 0){
mpfr_set_d(ret, AL[mpfr_get_ui(val, MPFR_RNDN)], MPFR_RNDN);
}else{
mpfr_set(ret, val, MPFR_RNDN);
mpfr_add_d(ret, ret, 0.5, MPFR_RNDN);
mpfr_log(LV, val, MPFR_RNDN);
mpfr_mul(ret, LV, ret, MPFR_RNDN);
mpfr_sub(ret, ret, val, MPFR_RNDN);
mpfr_add_d(ret, ret, 0.399089934, MPFR_RNDN);
}
}
Run Code Online (Sandbox Code Playgroud)
我有几个不同的想法:
我还可以采取其他方法吗?
在刚刚编写CUDA内核时,我有机会测试以下代码的结果:
unsigned char temp1 = 0x00;
unsigned char temp2 = 0x00;
unsigned char temp3 = temp1/temp2;
printf("%02X", temp3);`
Run Code Online (Sandbox Code Playgroud)
此代码打印"0xFF".我对此极为困惑,有人可以提供解释吗?
我正在为一块网络中间件编写一些代码.现在,我们的代码运行得太慢了.
我们已经完成了一轮重写和优化,但我们似乎在软件方面遇到了很多限制.
代码的缓慢源于一个子程序 - 来自计算统计的深奥抽样算法.因为所涉及的数学有点类似于在DSP中完成的工作,所以我想知道我们是否可以使用FPGA来加速计算.
我的问题基本上在标题中 - 我如何判断FPGA(甚至ASIC)是否会在我的用例中提供有用的加速?
编辑:"有用的"加速是足以证明构建FPGA所需的成本和开发时间的重要因素.
我一直试图解析它们几天,我不能理解它.他们来了:
int left = S->buflen >> 3;
int fill = 64 - left;
if(left && (((datalen >> 3) & 0x3F) >= (unsigned)fill)){
some code here
}
Run Code Online (Sandbox Code Playgroud)
如果有帮助,这是SHA-3候选BLAKE256的参考实现.