私は現在、パフォーマンスの改善が必要な Java アプリケーション用の C モジュールを開発しています (背景については、ネットワーク コーディング エンコーディングのパフォーマンスの改善を参照してください)。SSE-intrinsics を使用してコードを最適化しようとしましたが、Java バージョンよりもいくらか高速に実行されます (~20%)。ただし、まだ十分な速さではありません。
残念ながら、C コードの最適化に関する私の経験は多少限られています。したがって、現在の実装を改善する方法についていくつかのアイデアを得たいと思っています。
ホットスポットを構成する内側のループは次のようになります。
for (i = 0; i < numberOfGFVectorsInFragment; i++) {
// Load the 4 GF-elements from the message-fragment and add the log of the coefficeint to them.
__m128i currentMessageFragmentVector = _mm_load_si128 (currentMessageFragmentPtr);
__m128i currentEncodedResult = _mm_load_si128(encodedFragmentResultArray);
__m128i logSumVector = _mm_add_epi32(coefficientLogValueVector, currentMessageFragmentVector);
__m128i updatedResultVector = _mm_xor_si128(currentEncodedResult, valuesToXor);
_mm_store_si128(encodedFragmentResultArray, updatedResultVector);
encodedFragmentResultArray++;
currentMessageFragmentPtr++;
}