Эта часть кода взята из метода dotproduct моего векторного класса. Метод выполняет вычисление внутреннего продукта для целевого массива векторов (1000 векторов).
Когда длина вектора является нечетным числом (262145), время вычисления составляет 4,37 секунды. Когда длина вектора (N) равна 262144 (кратно 8), время вычисления составляет 1,93 секунды.
time1=System.nanotime();
int count=0;
for(int j=0;j<1000;i++)
{
b=vektors[i]; // selects next vector(b) to multiply as inner product.
// each vector has an array of float elements.
if(((N/2)*2)!=N)
{
for(int i=0;i<N;i++)
{
t1+=elements[i]*b.elements[i];
}
}
else if(((N/8)*8)==N)
{
float []vek=new float[8];
for(int i=0;i<(N/8);i++)
{
vek[0]=elements[i]*b.elements[i];
vek[1]=elements[i+1]*b.elements[i+1];
vek[2]=elements[i+2]*b.elements[i+2];
vek[3]=elements[i+3]*b.elements[i+3];
vek[4]=elements[i+4]*b.elements[i+4];
vek[5]=elements[i+5]*b.elements[i+5];
vek[6]=elements[i+6]*b.elements[i+6];
vek[7]=elements[i+7]*b.elements[i+7];
t1+=vek[0]+vek[1]+vek[2]+vek[3]+vek[4]+vek[5]+vek[6]+vek[7];
//t1 is total sum of all dot products.
}
}
}
time2=System.nanotime();
time3=(time2-time1)/1000000000.0; //seconds
Вопрос: может ли сокращение времени с 4,37 с до 1,93 с (в 2 раза быстрее) быть мудрым решением JIT использовать SIMD-инструкции или просто положительным эффектом моего развертывания цикла?
Если JIT не может автоматически оптимизировать SIMD, то в этом примере также нет оптимизации развертывания, выполняемой JIT автоматически, так ли это?
Для 1M итераций (векторов) и для размера вектора 64 множитель ускорения достигает 3,5X (преимущество кеша?).
Спасибо.