Самый быстрый способ умножения массива 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
.