Как оптимизировать C-код с SSE-интринками для упакованных 32x32 => 64-битных умножений и распаковки половин этих результатов для (полей Галуа)

Я некоторое время боролся с производительностью сетевого кодирования в разрабатываемом мной приложении (см. Оптимизация SSE-кода, Улучшение производительности сетевого кодирования и Распределение OpenCL). Сейчас я довольно близок к достижению приемлемой производительности. Вот текущее состояние самого внутреннего цикла (на который тратится >99% времени выполнения):

while(elementIterations-- >0)
{   
    unsigned int firstMessageField = *(currentMessageGaloisFieldsArray++);
    unsigned int secondMessageField = *(currentMessageGaloisFieldsArray++);
    __m128i valuesToMultiply = _mm_set_epi32(0, secondMessageField, 0, firstMessageField);
    __m128i mulitpliedHalves = _mm_mul_epu32(valuesToMultiply, fragmentCoefficentVector);
}

Есть ли у вас какие-либо предложения по дальнейшей оптимизации? Я понимаю, что это трудно сделать без большего контекста, но любая помощь будет оценена по достоинству!

8
задан Peter Cordes 4 February 2019 в 09:23
поделиться