最近我写了一些代码(ISO/ANSI C),然而它的性能表现令人惊讶。长话短说,罪魁祸首是 floor()
函数。不仅速度慢,而且在使用英特尔编译器(即 ICL)进行向量化时也无法实现。
以下是对在二维矩阵中的所有单元格执行 floor 的一些基准测试:
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]);
}
}
}
static inline
而不是inline
- 参见 https://dev59.com/HWkv5IYBdhLWcg3w8FSY#10245969 - Christoph