我有一个手动滚动矩阵算法,它可以找到一个正方形矩阵的右下正方形的最大数目(因此,当迭代时,某些部分被“跳过”)存储为密集矩阵。在来自的更新之后
vs2010
到
vs2017
这似乎要慢得多——总体上大约有50%的减速。经过一些调查,这被定位到一个函数的内环,寻找绝对最大值。看着
assembler
输出,这似乎是由于一些额外的
mov
gcc
相比之下,似乎没有这个“问题”。
简化示例(
fabs
不一定需要复制):
#include <cmath>
#include <iostream>
int f_slow(double *A, size_t from, size_t w)
{
double biga_absval = *A;
size_t ir = 0,ic=0;
for ( size_t j = 0; j < w; j++ ) {
size_t n = j*w;
for ( ; n < j*w+w; n++ ) {
if ( fabs(A[n]) <= biga_absval ) {
biga_absval = fabs( A[n] );
ir = j;
ic = n;
}
n++;
}
}
std::cout << ir <<ic;
return 0;
}
int f_fast(double *A, size_t from, size_t w)
{
double* biga = A;
double biga_absval = *biga;
double* n_begin = A + from;
double* n_end = A + w;
for (double* A_n = n_begin; A_n < n_end; ++A_n) {
if (fabs(*A_n) > biga_absval) {
biga_absval = fabs(*A_n);
biga = A_n;
}
}
std::cout << biga;
return 0;
}
int f_faster(double *A, size_t from, size_t w)
{
double biga_absval = *A;
size_t ir = 0,ic=0;
for ( size_t j = 0; j < w; j++ ) {
size_t n = j;
for ( ; n < j*w+w; n++ ) {
if ( fabs(A[n]) > biga_absval ) {
biga_absval = fabs( A[n] );
ir = j;
ic = n - j*w;
}
n++;
}
}
std::cout << ir <<ic;
return 0;
}
请注意
:创建示例只是为了查看输出(索引等不一定有意义):
https://godbolt.org/z/q9rWwi
使用最新的稳定
vs2017
15.9.5
更新:
压敏电阻
我看到的是在跳转代码之前-在编译器资源管理器中找到的最简单的方法是右键单击
if
然后“滚动至”。