-
Notifications
You must be signed in to change notification settings - Fork 742
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
Comments
柯西矩阵只是启动稍微快一点点,传输速度没有差别, |
柯西矩阵不是降低解码复杂度用的么? |
在这个量级,速度没有差别,范德蒙矩阵也能到1GB/s 以上 |
解码复杂度降了应该能节约点功耗吧。无源设备(靠电池供电)的都得几毫安几毫安的降功耗。 |
另外看这个实现上把速度提升到 15GB/s per core 了,没计划试试? |
几乎没有差别,对于<100MB/s的网速 |
有空了可以加来试试 |
柯西矩阵求逆确实有复杂度更低的算法,但 decode matrix 并不只是一个柯西矩阵。 Cauchy Reed Solomon(CRS) 所用的算法并不同于利用 SIMD 加速有限域的算法,CRS 的提出在此之前,且性能不如 SIMD,现已不用了。 目前 Cauchy matrix 的优势在于初始化简单,由 Cauchy matrix 和单位矩阵构成的 encoding matrix 任意子矩阵可逆,证明可见: https://github.com/templexxx/reedsolomon/blob/master/invertible.jpg |
谢谢,学习了。虽然看不太懂。 |
LDPC 有打算找时间实现一个试试,原理上确实比 RS 效率更高。暂未排期,估计还得很久 :D |
纠删码和纠错码应该是两回事吧,能convert? |
@xtaci 是两回事,逻辑得变,如果用 LDPC |
请问RS纠删码和RS纠错码在实现上具体有什么区别吗 |
@xygdys 一个可以发现错误并纠正,一个你得告诉它哪里错了然后纠正(纠删码),纠删码恢复的数据更多 |
|
按道理你能问这些问题应该对纠删码,纠错码是有一定了解了。我这里简单说一下你应该就明白了,或者该知道去查阅什么资料了:
|
@templexxx 太感谢了 |
求问有没有C++(或C)版本的 柯西矩阵的RS纠删源码 @templexxx @liping17 |
@EEEEEric-tao https://github.com/intel/isa-l/tree/master/erasure_code |
Cauchy Matrix比ReedSolomon在编解码效率上有对比么? |
@xtaci 粗略看了下https://github.com/intel/isa-l/tree/master/erasure_code里面的代码,cauchy在求解逆矩阵还是使用的高斯消元法---复杂度O(n^3), 那么效率只能体现在编码端了,编码端构造编码矩阵直接查inv表 |
上面的评论有提到,现在都用 SIMD 加速有限域运算了,编解码效率 vandermonde 还是 cauchy 没区别 @EEEEEric-tao 只不过为了保证编码后原始数据不变的性质,vandermonde matrix 由于不是任意子矩阵可逆所以要进行一个初等变换: |
@templexxx |
@EEEEEric-tao 求逆运算开销不算大,理论上特殊矩阵求逆应该可以找到一些讨巧的方法。考虑到 GFN,随着N变大,编码速度快速下降,那么求逆运算开销的上升占整体的开销也不大了。另外可以缓存逆矩阵的结果,用一个 bitmap 作 key 就可以。 |
//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
The text was updated successfully, but these errors were encountered: