提高网络编码-编码的性能

Posted

技术标签:

【中文标题】提高网络编码-编码的性能【英文标题】:Improving performance of network coding-encoding 【发布时间】:2011-10-12 08:53:16 【问题描述】:

我目前正在开发一个基于 Java 的网络编码库 (http://en.wikipedia.org/wiki/Network_coding)。这是非常占用 CPU 资源的,因此需要一些帮助来优化编码阶段。我实际上在做的是创建原始数据的随机线性组合,其中加法是 XOR,乘法是伽罗瓦域乘法(在 GF(2^16) 中)。

我已经尽我所能进行优化。例如,我正在使用这样的技巧:http://groups.google.com/group/comp.dsp/browse_thread/thread/cba57ae9db9971fd/7cd21eec39ddae1a?hl=en&lnk=gst&q=Sarwate+Galois#7cd21eec39ddae1a 使乘法更快。

因此,我正在寻找有关如何进一步优化此功能的提示。很难分析,因为我使用的分析器没有给你任何关于哪个操作最昂贵的提示(例如,它是数组查找还是 XOR)。所以我正处于随机尝试不同的想法并测试它是否能提高整体性能的地步。

更具体地说,我需要帮助的一些潜在改进领域是:

如何确保 Java 可以跳过对数组操作的边界检查? HotSpot 优化完成后如何检索实际执行的字节码?

这是算法的核心。脱离上下文可能很难理解,但如果您看到我正在做的任何不必要的昂贵操作,请告诉我!

int messageFragmentStart = 0;
int messageFragmentEnd = fragmentCharSize;

int coefficientIndex = fragmentID * messageFragmentsPerDataBlock;
final int resultArrayIndexStart = fragmentID * fragmentCharSize;

for (int messageFragmentIndex = 0; messageFragmentIndex < messageFragmentsPerDataBlock; messageFragmentIndex++) 
    final int coefficientLogValue = coefficientLogValues[coefficientIndex++];
    int resultArrayIndex = resultArrayIndexStart;
    for (int i = messageFragmentStart; i < messageFragmentEnd; i++) 
        final int logSum = coefficientLogValue + logOfDataToEncode[i];
        final int messageMultipliedByCoefficient = expTable[logSum];                        
        resultArray[resultArrayIndex++] ^= messageMultipliedByCoefficient;
    
    messageFragmentStart += fragmentCharSize;
    messageFragmentEnd = Math.min(messageFragmentEnd + fragmentCharSize, maxTotalLength);

【问题讨论】:

【参考方案1】:

您不能让 Java 放弃 JLS 中指定的边界检查。但在大多数情况下,只要边界检查很简单,JIT 就能避免这种情况(例如i &lt; array.length)——如果不是,就没有办法避免它(我假设可以玩不安全的对象?)。

对于您的第二个问题,这里有 this 应该可以很好地满足目的。

但无论如何,从您的代码来看,这个问题似乎对矢量化来说是微不足道的,遗憾的是 JVM 并不擅长它/根本不做它。因此,使用编译内在函数在 c/c++ 中实现相同的代码(您甚至可以尝试 ICC/GCC 的自动矢量化)可能会导致一些非常明显的加速 - 假设我们没有完全受内存限制。所以我会在 C++ 中实现它并使用 JNI 仅供参考。

【讨论】:

谢谢!我尝试使用 PrintAssembly,但收到以下错误消息:“无法加载 hsdis-amd64.dll;库不可加载;PrintAssembly 已禁用”。关于我可以在哪里获得这个 dll 的任何想法? 没关系。我更改为 JDK 7 (x86) 并在 classparser.blogspot.com/2010/03/hsdis-i386dll.html 找到了对应的 dll。

以上是关于提高网络编码-编码的性能的主要内容,如果未能解决你的问题,请参考以下文章

The WAY to 优化JAVA程序设计和编码,提高JAVA性能

python - 技术提高要点之一,函数式编程,性能,测试和编码规范

能够提高Java应用性能的编码建议

LDPC编码CDR系统中LDPC编码,LDPC编码的码长为9216

Java8 Stream 提高编码效率,早点下班

经纬度逆编码方法与性能优化