В настоящее время я разрабатываю C-модуль для Java-приложения, которое нуждается в некоторых улучшениях производительности (см. Повышение производительности сетевого кодирования кодирования для фона). Я попытался оптимизировать код с помощью 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++;
}