Я хотел записать частичный ответ в ответ на некоторые из приведенных выше комментариев.Это помогает, делая несколько модов одновременно.
if (start < (1ULL << DBL_MANT_DIG)) {
__m256d div1 = _mm256_broadcastsd_pd(_mm_cvtsi64_sd(_mm_setzero_pd(), start - 1));
__m128i one = _mm_set1_epi32(-1);
__m128i fact = *(__m128i *)(&prime[i]);
__m256d div2 = _mm256_cvtepi32_pd(fact);
__m128i rem = _mm256_cvtpd_epi32(_mm256_fnmadd_pd(
_mm256_floor_pd(_mm256_div_pd(div1, div2)), div2, div1));
*(__m256i *)(&answer[i]) = _mm256_cvtepu32_epi64(_mm_sub_epi32(fact,
_mm_sub_epi32(rem, one)));
}
Пожалуйста, прокомментируйте, если у вас есть улучшение этого частичного ответа.