我必须计算汉明重量以获得相当快速的连续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) 我试图弄清楚在 Mandelbrot 分形中移动时如何自动调整最大迭代值。
我发现的所有示例都使用 1000 或更少的常数,但这在放大分形集时还不够。
有没有办法根据例如您在 Mandelbrot 空间(x_start,x_end,y_start,y_end)中的位置来确定 max_iterations 的数量?