小编And*_*ius的帖子

最快的64位人口数(汉明重量)

我必须计算汉明重量以获得相当快速的连续64位数据流,并且使用popcnt汇编指令引起了我的一个例外,即我的英特尔酷睿i7-4650U.

我检查了我的圣经黑客的喜悦,并扫描了网络上的各种算法(因为他们在计算机诞生时开始解决这个'问题',所以这里有很多算法).

我在周末玩了一些我自己的想法并提出了这些算法,我几乎可以将数据移入和移出CPU.

    //64-bit popcnt using BMI2
_popcnt_bmi2:
        mov         (%rdi),%r11
        pext        %r11,%r11,%r11
        not         %r11
        tzcnt       %r11,%r11
        mov         %r11,(%rdx)
        add         $8h,%rdi
        add         $8h,%rdx
        dec         %rsi
        jnz         _popcnt_bmi2
        ret
Run Code Online (Sandbox Code Playgroud)

在上面的代码中我使用pext(BMI2),其中输入数据使用自身作为掩码.然后,所有存在的位将从结果寄存器中的最低有效位(本身再次)开始崩溃.然后我需要计算折叠位的数量,所以我反转所有位然后tzcnt用来计算现在为零的数量.我认为这是一个相当不错的主意.

然后我也尝试了AVX2方法:

//64-bit popcnt using AVX2
_popcnt_avx2:
        vmovdqa     (%rcx),%ymm2
        add         $20h,%rcx
        vmovdqa     (%rcx),%ymm3
        add         $20h,%rcx
        vmovdqa     (%rcx),%ymm4
popcnt_avx2_loop:
        vmovdqa     (%rdi),%ymm0
        vpand       %ymm0, %ymm2, %ymm1
        vpandn      %ymm0, %ymm2, %ymm0
        vpsrld      $4h,%ymm0, %ymm0
        vpshufb     %ymm1, %ymm3, %ymm1
        vpshufb     %ymm0, %ymm3, %ymm0
        vpaddb      %ymm1,%ymm0,%ymm0       //popcnt (8-bits)
        vpsadbw     %ymm0,%ymm4,%ymm0       //popcnt (64-bits) …
Run Code Online (Sandbox Code Playgroud)

optimization performance assembly simd avx

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

放大 Mandelbrot 时计算动态迭代值

我试图弄清楚在 Mandelbrot 分形中移动时如何自动调整最大迭代值。

我发现的所有示例都使用 1000 或更少的常数,但这在放大分形集时还不够。

有没有办法根据例如您在 Mandelbrot 空间(x_start,x_end,y_start,y_end)中的位置来确定 max_iterations 的数量?

formula mandelbrot

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

标签 统计

assembly ×1

avx ×1

formula ×1

mandelbrot ×1

optimization ×1

performance ×1

simd ×1