Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
liping17 opened this issue Feb 20, 2020 · 17 comments
Open

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

liping17 opened this issue Feb 20, 2020 · 17 comments

Comments

@liping17
Copy link

liping17 commented Feb 20, 2020

//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

@xtaci
Copy link
Owner

xtaci commented Feb 20, 2020

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

@liping17
Copy link
Author

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

@xtaci
Copy link
Owner

xtaci commented Feb 20, 2020

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

@liping17
Copy link
Author

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

@liping17
Copy link
Author

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

@xtaci
Copy link
Owner

xtaci commented Feb 20, 2020

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

@xtaci
Copy link
Owner

xtaci commented Feb 20, 2020

有空了可以加来试试

@templexxx
Copy link
Contributor

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

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

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

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

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

@liping17
Copy link
Author

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

@templexxx
Copy link
Contributor

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

@liping17

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

@xtaci
Copy link
Owner

xtaci commented Feb 21, 2020

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

@xtaci xtaci pinned this issue Feb 21, 2020
@templexxx
Copy link
Contributor

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

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

@xygdys
Copy link

xygdys commented Mar 6, 2022

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

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

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

@templexxx
Copy link
Contributor

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

@xygdys
Copy link

xygdys commented Mar 6, 2022

@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. 这个项目里针对大数据(超过有限域长度)的消息是否是通过分组(多个多项式并行)来编码的?

@templexxx
Copy link
Contributor

@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字节),编码基于矩阵运算做的。

@xygdys
Copy link

xygdys commented Mar 6, 2022

@templexxx 太感谢了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants