Optimzing SSE-code

В настоящее время я разрабатываю 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++;
    }

6
задан Community 23 May 2017 в 12:22
поделиться