Недавно я написал код (ISO/ANSI C), и был удивлен низкой результативностью, которую он достиг. Короче говоря, оказалось, что виновником была функция floor()
. Он не только медленный, но и не векторизованный (с компилятором Intel, иначе ICL).
Вот несколько эталонных тестов для выполнения пол для всех ячеек в 2D-матрице:
VC: 0.10
ICL: 0.20
Сравните это с простым произведением:
VC: 0.04
ICL: 0.04
Как floor()
может быть намного медленнее, чем просто? Это по сути то же самое (кроме отрицательных чисел).
Второй вопрос: знает ли кто-нибудь о сверхбыстрой реализации floor()
?
PS: Вот цикл, который я сравнивал:
void Floor(float *matA, int *intA, const int height, const int width, const int width_aligned)
{
float *rowA=NULL;
int *intRowA=NULL;
int row, col;
for(row=0 ; row<height ; ++row){
rowA = matA + row*width_aligned;
intRowA = intA + row*width_aligned;
#pragma ivdep
for(col=0 ; col<width; ++col){
/*intRowA[col] = floor(rowA[col]);*/
intRowA[col] = (int)(rowA[col]);
}
}
}