3x3 матричное векторное умножение с использованием GMP - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть вектор больших (до 2048 битов) целых чисел со знаком (fa, fb, fc) и матрицы 3x3 со знаком int64_t (аа, ab, ac, ba, bb, bc, ca, cb, cc).Я хочу обновить (fa, fb, fc) путем умножения на упомянутую матрицу.Это происходит много раз в моем коде, я профилировал и обнаружил, что описанные выше шаги занимают значительную часть моего времени выполнения.

В настоящее время мой код следующий

mpz_mul_si(faa, f.a, aa);
mpz_mul_si(fab, f.b, ab);
mpz_mul_si(fac, f.c, ac);

mpz_mul_si(fba, f.a, ba);
mpz_mul_si(fbb, f.b, bb);
mpz_mul_si(fbc, f.c, bc);

mpz_mul_si(fca, f.a, ca);
mpz_mul_si(fcb, f.b, cb);
mpz_mul_si(fcc, f.c, cc);

mpz_add(f.a, faa, fab);
mpz_add(f.a, f.a, fac);

mpz_add(f.b, fba, fbb);
mpz_add(f.b, f.b, fbc);

mpz_add(f.c, fca, fcb);
mpz_add(f.c, f.c, fcc);

Iпытался делать все отдельные умножения и сложения в отдельных потоках и соединять их (используя std :: thread), но это несказанно замедляет производительность.Я думал, что было бы лучше использовать addmul_ui и submul_ui функции из gmp.Однако в целом они оказываются медленнее, хотя я не уверен, почему.Даже улучшение на несколько процентов поможет.Целевое оборудование:

Dell Inspiron 3670 64-битный i5 -8400 @ 2,8 ГГц, 8 ГБ ОЗУ: Geforce GTX 1060 3 ГБ

...