kcp-go icon indicating copy to clipboard operation
kcp-go copied to clipboard

建议RS码默认使用柯西矩阵

Open liping17 opened this issue 5 years ago • 24 comments

//reedsolomon里面支持柯西矩阵了,加个参数应该就可以 codec, err := reedsolomon.New(dataShards, parityShards, reedsolomon.WithCauchyMatrix()) if err != nil { return nil } //看minio里面,还用了WithAutoGoroutines,不知道能有多大效果 e.encoder, err = reedsolomon.New(dataBlocks, parityBlocks, reedsolomon.WithAutoGoroutines(int(e.ShardSize()))) if err != nil { logger.LogIf(ctx, err) return e, err } return

liping17 avatar Feb 20 '20 06:02 liping17

柯西矩阵只是启动稍微快一点点,传输速度没有差别, WithAutoGroutine对嵌入式不友好(router),内存难于控制。

xtaci avatar Feb 20 '20 08:02 xtaci

柯西矩阵不是降低解码复杂度用的么? 启用了应该是丢包的时候恢复速度更快吧

liping17 avatar Feb 20 '20 08:02 liping17

在这个量级,速度没有差别,范德蒙矩阵也能到1GB/s 以上

xtaci avatar Feb 20 '20 08:02 xtaci

解码复杂度降了应该能节约点功耗吧。无源设备(靠电池供电)的都得几毫安几毫安的降功耗。

liping17 avatar Feb 20 '20 08:02 liping17

另外看这个实现上把速度提升到 15GB/s per core 了,没计划试试? https://github.com/templexxx/reedsolomon

liping17 avatar Feb 20 '20 08:02 liping17

几乎没有差别,对于<100MB/s的网速

xtaci avatar Feb 20 '20 08:02 xtaci

有空了可以加来试试

xtaci avatar Feb 20 '20 08:02 xtaci

柯西矩阵不是降低解码复杂度用的么? 启用了应该是丢包的时候恢复速度更快吧

柯西矩阵求逆确实有复杂度更低的算法,但 decode matrix 并不只是一个柯西矩阵。

Cauchy Reed Solomon(CRS) 所用的算法并不同于利用 SIMD 加速有限域的算法,CRS 的提出在此之前,且性能不如 SIMD,现已不用了。

目前 Cauchy matrix 的优势在于初始化简单,由 Cauchy matrix 和单位矩阵构成的 encoding matrix 任意子矩阵可逆,证明可见:

https://github.com/templexxx/reedsolomon/blob/master/invertible.jpg

templexxx avatar Feb 20 '20 11:02 templexxx

谢谢,学习了。虽然看不太懂。 @templexxx 请问对raptorQ/LDPC编码有没有了解,据说比RS高效,但感觉更难理解。

liping17 avatar Feb 21 '20 01:02 liping17

谢谢,学习了。虽然看不太懂。 @templexxx 请问对raptorQ/LDPC编码有没有了解,据说比RS高效,但感觉更难理解。

@liping17

LDPC 有打算找时间实现一个试试,原理上确实比 RS 效率更高。暂未排期,估计还得很久 :D

templexxx avatar Feb 21 '20 02:02 templexxx

纠删码和纠错码应该是两回事吧,能convert?

xtaci avatar Feb 21 '20 03:02 xtaci

纠删码和纠错码应该是两回事吧,能convert?

@xtaci 是两回事,逻辑得变,如果用 LDPC

templexxx avatar Feb 21 '20 04:02 templexxx

纠删码和纠错码应该是两回事吧,能convert?

@xtaci 是两回事,逻辑得变,如果用 LDPC

请问RS纠删码和RS纠错码在实现上具体有什么区别吗

xygdys avatar Mar 06 '22 05:03 xygdys

@xygdys 一个可以发现错误并纠正,一个你得告诉它哪里错了然后纠正(纠删码),纠删码恢复的数据更多

templexxx avatar Mar 06 '22 05:03 templexxx

@xygdys 一个可以发现错误并纠正,一个你得告诉它哪里错了然后纠正(纠删码),纠删码恢复的数据更多 还有几个问题需要请教:

  1. 请问必须指定错误的位置才能恢复吗,看到了一篇文章里写的RS纠错码的解码为 RSDecode(n,e,t),其中n是数据块个数,e是错误的个数,t是原数据块的个数(也就是多项式的阶),是否是只要指定这几个参数就可以纠错?
  2. 这个项目里的RS码貌似在解码的时候只传递了n,t两个参数,是否只实现了纠删功能,而非纠错功能
  3. 请问有没有具体的关于RS纠错码(error correcting code,ECC)和在线纠错算法的实现(online error correcting,OEC)
  4. 这个项目里针对大数据(超过有限域长度)的消息是否是通过分组(多个多项式并行)来编码的?

xygdys avatar Mar 06 '22 06:03 xygdys

@xygdys 一个可以发现错误并纠正,一个你得告诉它哪里错了然后纠正(纠删码),纠删码恢复的数据更多 还有几个问题需要请教:

  1. 请问必须指定错误的位置才能恢复吗,看到了一篇文章里写的RS纠错码的解码为 RSDecode(n,e,t),其中n是数据块个数,e是错误的个数,t是原数据块的个数(也就是多项式的阶),是否是只要指定这几个参数就可以纠错?
  2. 这个项目里的RS码貌似在解码的时候只传递了n,t两个参数,是否只实现了纠删功能,而非纠错功能
  3. 请问有没有具体的关于RS纠错码(error correcting code,ECC)和在线纠错算法的实现(online error correcting,OEC)
  4. 这个项目里针对大数据(超过有限域长度)的消息是否是通过分组(多个多项式并行)来编码的?

按道理你能问这些问题应该对纠删码,纠错码是有一定了解了。我这里简单说一下你应该就明白了,或者该知道去查阅什么资料了:

  1. 这个项目用的是erasure code,不是 ECC
  2. reedsolomon 的 ECC实现 GitHub 上有开源项目,你可以搜一下。这个编码历史有差不多 60年了,什么实现都很成熟了
  3. 这个项目用的是 GF2^8(1字节),编码基于矩阵运算做的。

templexxx avatar Mar 06 '22 06:03 templexxx

@templexxx 太感谢了

xygdys avatar Mar 06 '22 07:03 xygdys