小编hon*_*ann的帖子

什么是最快的x86-64汇编语言划分算法的庞大数字?

我在X86-64汇编语言编写的代码库提供所有传统的按位,移位,逻辑,比较,运算和数学函数s0128,s0256,s0512,s1024签署整数类型和f0128,f0256,f0512,f1024浮点类型.到目前为止,我正在处理有符号整数类型,因为浮点函数可能会调用为整数类型编写的一些内部例程.

到目前为止,我已经编写并测试了函数来执行各种一元运算符,比较运算符以及加,减和乘法运算符.

现在我正在尝试决定如何为除法运算符实现函数.

我的第一个想法是,"Newton-Raphson必须是最好的方法".为什么?因为它给出了一个很好的种子(开始猜测)它很快收敛,我想我应该能够弄清楚如何在操作数上执行本机64位除法指令以获得一个很好的种子值.实际上,如果种子值精确到64位,要获得正确的答案应该只采取:

`s0128` : 1~2 iterations : (or 1 iteration  plus 1~2 "test subtracts")
`s0256` : 2~3 iterations : (or 2 iterations plus 1~2 "test subtracts")
`s0512` : 3~4 iterations : (or 3 iterations plus 1~2 "test subtracts")
`s1024` : 4~5 iterations : (or 4 iterations plus 1~2 "test subtracts")
Run Code Online (Sandbox Code Playgroud)

然而,更多地思考这个问题让我很奇怪.例如,我记得我编写的核心例程,它对所有大整数类型执行乘法运算:

s0128 :   4 iterations ==   4 (128-bit = 64-bit * 64-bit) …
Run Code Online (Sandbox Code Playgroud)

algorithm assembly x86-64 mathematical-optimization divide

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

ECC如何进行突发纠错工作?

ECC(错误校正码)如何进行突发错误纠正(磁盘驱动器样式)?

这要么是诅咒,要么是祝福,但我的大脑常常试图在梦中解决技术问题.有时确实如此.就像昨晚一样,我的大脑要求了解如何设计ECC算法(软件程序,但最终可能是FPGA电路),以实现适合磁盘驱动器的ECC.适用于这些设备的ECC类型似乎是"突发错误检测".

据我了解,磁盘驱动器出错的原因是磁盘表面的缺陷(规格或划痕).当磁头读取数据位并经过一个窄的划痕时,电路在大约1到64位的"突发"上产生正确和错误位值的随机混合.因此,据我所知,磁盘驱动器ECC的目标是能够纠正任何一个随机错误突发中的所有错误位.

顺便说一句,我自然不会"在数学中思考",所以请不要指向数学论文!我已经花了几个小时试图阅读维基百科关于里德 - 所罗门和其他各种计划,但这些文章中的数学对我来说是完全不可理解的(除非我花了几个星期研究它们......如果我很幸运).此外,从文本中,我认为这些方案中的任何一种都不适用于磁盘驱动器(但可能是CD/DVD).

无论如何,我将描述我的大脑在睡梦中想到的是什么,并要求任何人解释这种ECC实际应该如何完成,以及传统方法有多好.我确信我的计划效率必须低于某人知道他们在做什么,甚至可能在他们醒着时设计的技术!在我醒来之前,我试图找出如何处理每个轨道的两次爆发,但是醒来时失败了.所以我也问如何实现这一目标.


我的心理图像是一个4096字节的扇区,我精神上分成512个块,每个64位(因为我习惯于考虑64位块,因为我猜测64位突发错误就足够了出于实际目的.在我的应用程序中,每个数据流肯定是4096到8192字节.

我的方法是从4096字节的数据中计算10个64位ECC代码.因此ECC我的方案将在4096字节数据的最后一个之后写入十个64位代码== 80字节,这只是2%的开销.我将这十个64位ECC代码称为"code0"到"code9",每个代码在处理每个扇区之前开始清零.而且每个64位(8字节)数据序列都会因为缺少更好的术语而称之为"块".

code9 = XOR chunks 000 to 511 == 000 to 1FF : every chunk
code8 = XOR chunks 256 to 511 == 100 to 1FF : every chunk # with bit #8 == 1
code7 = XOR chunks 128 to 255 == 080 to 0FF : every chunk # with bit #7 == 1
        and chunks 384 to 511 == 180 to 1FF
code6 = XOR chunks 064 to 127 …
Run Code Online (Sandbox Code Playgroud)

algorithm 64-bit error-correction

6
推荐指数
0
解决办法
472
查看次数

在 x86-64 中展开循环实际上会使代码更快吗?

我想每个人都知道“展开循环意味着什么”。以防万一,我稍后会给出一个具体的例子。我要问的问题是……在 x86-64 汇编语言中展开循环实际上会使代码更快吗?我将解释为什么我开始质疑这个概念。

对于那些不熟悉“展开循环”一词的人,这里是我现在正在编写的代码中的一个循环示例:

    movq   $15, %rcx                  # rcx = loop iterations
s1024_divide_compare_loop:
    movq   (%r14, %rcx, 8), %rax      # rax = numerator
    subq   (%r15, %rcx, 8), %rax      # flags = numerator - denominator
    js     s1024_divide_done          # divide done: (numerator < denominator)
    jnz    s1024_upshift_done         # do the divide: (numerator > denominator)
    subq   $1, %rcx                   # rcx = rcx - 1 : one less loop interation
    jns    s1024_divide_compare_loop  # check next lower 64-bit portion of n & d
Run Code Online (Sandbox Code Playgroud)

这是循环展开的样子:

    movq   120(%r14), %rax …
Run Code Online (Sandbox Code Playgroud)

performance assembly caching loops loop-unrolling

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