gpt4 book ai didi

c - 带有 -Ofast 的 -DNDEBUG 比只有 -Ofast 慢

转载 作者:行者123 更新时间:2023-12-03 16:54:18 26 4
gpt4 key购买 nike

我正在优化一个简单的遗传算法和神经网络,我正在 GCC 中摆弄一些选项以生成更快的可执行文件。

在我的代码中,我有一些断言,例如

mat mat_add(mat a, mat b)
{
assert(a->rows == b->rows);
assert(a->cols == b->cols);
mat m = mat_create(a->rows, a->cols);
for(size_t i = 0; i < a->rows; i++) {
for(size_t j = 0; j < a->cols; j++)
mat_set(m, i, j, mat_get(a, i, j) + mat_get(b, i, j));
}
return m;
}

我想如果我添加 -DNDEBUG要禁用断言,可执行文件会更快,因为它不会检查上述条件。然而,它实际上更慢。

-DNDEBUG :
$ gcc src/*.c -lm -pthread -Iinclude/ -Wall -Ofast
$ for i in $(seq 1 5); do time ./a.out; done

real 0m11.677s
user 1m28.786s
sys 0m0.729s

real 0m11.716s
user 1m29.304s
sys 0m0.723s

real 0m12.217s
user 1m31.707s
sys 0m0.806s

real 0m12.602s
user 1m32.863s
sys 0m0.726s

real 0m12.225s
user 1m30.915s
sys 0m0.736s

-DNDEBUG :
$ gcc src/*.c -lm -pthread -Iinclude/ -Wall -Ofast -DNDEBUG
$ for i in $(seq 1 5); do time ./a.out; done

real 0m13.698s
user 1m42.533s
sys 0m0.792s

real 0m13.764s
user 1m43.337s
sys 0m0.709s

real 0m13.655s
user 1m42.986s
sys 0m0.739s

real 0m13.836s
user 1m43.138s
sys 0m0.719s

real 0m14.072s
user 1m43.879s
sys 0m0.712s

它并不慢得多,但很明显。

什么可能导致这种放缓?

最佳答案

mat_setmat_get函数对索引执行自己的边界检查?存在断言时,只有在 b->rows == a->rows 时才能到达循环是真的。这允许编译器优化任何检查 i < b->rowsmat_getb ,因为它知道b->rows == a->rowsi < a->rows由循环条件。

如果情况确实如此,您可以通过添加(GNU C 功能)在没有断言和任何运行时分支的情况下实现相同的目标:

if (a->rows != b->rows || a->cols != b->cols)
__builtin_unreachable();

一种更便携但不太可靠的方法是编写一些无意义的未定义行为,例如 1/0;if body 。

关于c - 带有 -Ofast 的 -DNDEBUG 比只有 -Ofast 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53878157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com