Самый быстрый способ умножения массива int64_t?

Я хочу векторизовать умножение двух выровненных массивов памяти. Я не нашел способа умножить 64 * 64 бит в AVX / AVX2, поэтому я просто развернул петлю и загрузил / сохранил AVX2. Есть ли более быстрый способ сделать это?

Заметка Я не хочу сохранять результат высокого половинного при каждом умножении.

void multiply_vex(long *Gi_vec, long q, long *Gj_vec){

    int i;
    __m256i data_j, data_i;
    __uint64_t *ptr_J = (__uint64_t*)&data_j;
    __uint64_t *ptr_I = (__uint64_t*)&data_i;


    for (i=0; i<BASE_VEX_STOP; i+=4) {
        data_i = _mm256_load_si256((__m256i*)&Gi_vec[i]);
        data_j = _mm256_load_si256((__m256i*)&Gj_vec[i]);

        ptr_I[0] -= ptr_J[0] * q;
        ptr_I[1] -= ptr_J[1] * q;
        ptr_I[2] -= ptr_J[2] * q;
        ptr_I[3] -= ptr_J[3] * q;

        _mm256_store_si256((__m256i*)&Gi_vec[i], data_i);
    }


    for (; i<BASE_DIMENSION; i++)
        Gi_vec[i] -= Gj_vec[i] * q;
}

ОБНОВИТЬ Я использую микроархитектуру Haswell с обоими компиляторами ICC / GCC. Так что и AVX, и AVX2 в порядке. Я заменяю-= С интригой_mm256_sub_epi64 после разворачивания цикла умножения, где оно ускоряется. В настоящее время этоptr_J[0] *= q; ...

Я использую__uint64_t но этоошибк. Правильный тип данных -__int64_t.

Ответы на вопрос(2)

Ваш ответ на вопрос