Комментарии 1
По всему видно у Вас хороший компилятор, т.к. мой даже не стал векторизовать начальный код :) Да и интринсики у меня тоже не работают :) Пришлось мне Ваш итоговый код набрать ассемблером
unsigned int task_1_vector_fast(unsigned int n) {
unsigned int sum;
n--;
asm volatile("vsetivli x0, 3, e32, m1");
asm volatile("vmv.v.x v3, %0 ;" ::"r"(n)); // v3=n-1
asm volatile("vle32.v v1, (%0);" ::"r"(c)); // v1 = c
asm volatile("vmul.vv v4,v3,v1 ;"); // v4 = klm = (n-1)*c
asm volatile("vle32.v v2, (%0);" ::"r"(d)); // v2 = d
asm volatile("vsrl.vi v4,v4,16;"); // klm>>=16
asm volatile("vmv.v.i v8, 0"); // sum=0
asm volatile("vadd.vi v5,v4,1 ;"); // v5=klm+1
asm volatile("vmul.vv v6,v4,v5 ;"); // v6 = klm*(klm+1)
asm volatile("vmul.vv v6,v6,v2 ;"); // v6 = d * klm*(klm+1)
asm volatile("vsra.vi v6,v6,1;"); // v6 = d * klm*(klm+1)/2
asm volatile("vredsum.vs v8, v6, v8");
asm volatile("vmv.x.s %0, v8" : "=r"(sum) :); // return = sum
return sum;
}
Скалярный вариант исполнился за 19 тактов, а векторный за 26. Итого 0.73 У Вас 0.69. Практически одинаковое "ускорение" от векторизации :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Project Euler. Векторное программирование и задача номер 1