小编pg1*_*989的帖子

我需要非常快地计算斯特林近似

我正在编写一个用于统计采样的小型库,它需要尽可能快地运行。在分析中,我发现函数中大约 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)

我有几个不同的想法:

  • 预先计算函数前 8 个以上的输入。
  • 优化数学(使用较粗略的近似值以获得较小的精度)
  • 使用多个线程并行计算不同的输入
  • 当数字适合机器数据类型时切换到本机算术

我还可以采取其他方法吗?

c c++ numerical mpfr arbitrary-precision

5
推荐指数
1
解决办法
870
查看次数

CUDA内核中未定义的分区 - 有什么想法吗?

在刚刚编写CUDA内核时,我有机会测试以下代码的结果:

unsigned char temp1 = 0x00;
unsigned char temp2 = 0x00;
unsigned char temp3 = temp1/temp2;

printf("%02X", temp3);`
Run Code Online (Sandbox Code Playgroud)

此代码打印"0xFF".我对此极为困惑,有人可以提供解释吗?

math cuda divide-by-zero

1
推荐指数
1
解决办法
681
查看次数

FPGA在这里有用吗?

我正在为一块网络中间件编写一些代码.现在,我们的代码运行得太慢了.

我们已经完成了一轮重写和优化,但我们似乎在软件方面遇到了很多限制.

代码的缓慢源于一个子程序 - 来自计算统计的深奥抽样算法.因为所涉及的数学有点类似于在DSP中完成的工作,所以我想知道我们是否可以使用FPGA来加速计算.

我的问题基本上在标题中 - 我如何判断FPGA(甚至ASIC)是否会在我的用例中提供有用的加速?

编辑:"有用的"加速是足以证明构建FPGA所需的成本和开发时间的重要因素.

optimization fpga

1
推荐指数
1
解决办法
82
查看次数

这三行C代码究竟做了什么?

我一直试图解析它们几天,我不能理解它.他们来了:

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的参考实现.

c hash bit-manipulation

0
推荐指数
1
解决办法
186
查看次数