Tag: 优化

为什么icc无法以合理的方式处理编译时分支提示?

开发人员可以使用__builtin_expect 内置来帮助编译器了解分支可能走向哪个方向。 在将来,我们可能会为此目的获得一个标准属性 ,但截至今天,至少所有clang , icc和gcc支持非标准的__builtin_expect 。 但是,当你使用它时, icc似乎会生成奇怪的代码1 。 也就是说,无论使用哪个方向进行预测,使用内置函数的代码都严格地比没有内置代码的代码更糟糕。 以下面的玩具function为例: int foo(int a, int b) { do { a *= 77; } while (b– > 0); return a * 77; } 在三个编译器中, icc是唯一一个将其编译为3个指令的最佳标量循环的编译器: foo(int, int): ..B1.2: # Preds ..B1.2 ..B1.1 imul edi, edi, 77 #4.6 dec esi #5.12 jns ..B1.2 # Prob 82% […]

C编译器是否能够跨目标文件进行优化?

我正在考虑标题与标题和源代码设计之间的关系。 我不确定标头和源是否允许编译器跨目标文件和链接进行优化? 内联优化?

一些mandelbrot绘制例程从c到sse2

我想重写这样简单的例程到SSE2代码,(最好是在nasm中)我并不完全确定如何做,两件事情不清楚(如何表达计算(内循环和那些来自外循环)以及如何调用c代码函数“SetPixelInDibInt(i,j,palette [n]);”来自staticaly链接的asm代码 void DrawMandelbrotD(double ox, double oy, double lx, int N_ITER) { double ly = lx * double(CLIENT_Y)/double(CLIENT_X); double dx = lx / CLIENT_X; double dy = ly / CLIENT_Y; double ax = ox – lx * 0.5 + dx * 0.5; double ay = oy – ly * 0.5 + dy * 0.5; static […]

比较c中字节数组中的任意位序列

我的c代码中有几个uint8_t数组,我想比较一个和另一个的任意序列位。 例如,我有bitarray_1和bitarray_2,我想比较bitarray_1的bit 13 – 47和bitarray_2的5-39位。 最有效的方法是什么? 目前它是我程序中的一个巨大瓶颈,因为我只是有一个简单的实现,将位复制到新的临时数组的开头,然后在它们上使用memcmp。

为什么int * float比int / int快?

我一直在读点浮点数学就像一个小型的Arduino微控制器坏了。 因此,在尝试使用更少的花车时,我发现了一些奇怪的东西。 // Baseline float brightness = 0.05; int result = someInt * brightness; // Takes about twice as long int brightness = 20; int result = someInt / brightness; 两者都有相同的目标,将整数减少到原始值的二十分之一。 但在进行数学优化时,我不确定为什么浮点数更快。

告知clang内联汇编读取特定的内存区域

GCC(我可以方便地测试的所有版本)可以告诉内联汇编语句读取一个特定的内存区域(表示为指针p和大小为n ),这个结构非常难以理解: asm (“…” : : “m” (*(struct { char x[n]; } *)p)); 但是,这在clang中不起作用(3. [45]),你得到一个很难的错误: error: fields must have a constant size: ‘variable length array in structure’ extension will never be supported asm (“…” : : “m” (*(struct {char x[n];} *)p)); ^ 是否(理想情况下)是一个不同的构造,它将在两个编译器中产生相同的效果,或者(不这样)一个不同的构造,只会在clang中产生相同的效果? 请注意,在我关心的情况下,我没有插入实际的assembly说明; 构造的要点是指示编译器不要删除明显死的memset 。 因此,“不同构造”完全不能完全涉及内联组装。 但是,请建议读取任意内存或生成其他代码的构造,只有在没有其他选择的情况下。 另外,不要建议memset_s , explicit_bzero或类似的; 这是尝试在不必破解编译器的情况下实现这些函数的回退。 随后是全面的演示程序 – #include […]

为什么在比较范围内的数字时,汇编代码中是否出现分支?

我正在读这个问题,这是接受的答案。 我阅读了评论,但我无法弄清楚产生优化的原因。 使用以下代码时,为什么在汇编代码中出现分支? x >= start && x <= end 编辑: 为清楚起见,我想了解接受答案产生优化的原因。 据我所知,编译器生成的汇编代码中存在分支。 我想了解为什么生成的代码中有一个分支。

设计一个快速的“滚动窗口”文件阅读器

我正在用C ++编写一个用“滑动窗口”扫描文件的算法,这意味着它将扫描字节0到n,做一些事情,然后扫描字节1到n + 1,做某事,等等,直到结束到达了。 我的第一个算法是读取前n个字节,做一些事情,转储一个字节,读取一个新字节,然后重复。 这非常慢,因为来自HDD的“ReadFile”一次一个字节是低效的。 (约100kB / s) 我的第二个算法涉及将一个文件块(可能是n * 1000个字节,意味着整个文件,如果它不是太大)读入缓冲区并从缓冲区读取单个字节。 现在我得到大约10MB / s(体面的SSD +酷睿i5,1.6GHz笔记本电脑)。 我的问题:你对更快的模型有什么建议吗? 编辑 : 我的大缓冲区(相对于窗口大小)实现如下: – 对于5kB的滚动窗口,缓冲区初始化为5MB – 将文件的前5MB读入缓冲区 – 窗口指针从缓冲区的开头开始 – 移动时,窗口指针递增 – 当窗口指针接近5MB缓冲区的末尾时(例如4.99MB),将剩余的0.01MB复制到缓冲区的开头,将窗口指针复位到开头,并将另外的4.99MB读入缓冲区。 – 重复一遍 编辑2 – 实际实施(删除) 感谢大家多多有见地的回应。 选择“最佳答案”很难; 他们都很优秀,并帮助我编码。

使用零流优化更新MD5 / SHA1

是否可以优化function: MD5_Update(&ctx_d, buf, num); 如果你知道buf只包含零? 或者这在数学上是不可能的? 同样适用于SHA1。

C / C ++不确定值:编译器优化提供不同的输出(示例)

看起来C / C ++编译器(clang,gcc等)产生与优化级别相关的不同输出。 您也可以查看这篇文章中包含的在线链接。 http://cpp.sh/5vrmv (将输出从none更改为-O3以查看差异)。 根据以下代码,有人可以解释我的一些问题: #include #include int main(void) { int *p = (int *)malloc(sizeof(int)); free(p); int *q = (int *)malloc(sizeof(int)); if (p == q) { *p = 10; *q = 14; printf(“%d”, *p); } return 0; } 是否确定执行将始终进入if语句? 我们怎么知道两个指针p和q的地址是一样的? 为什么没有优化有输出14 ,而-O3有相同指令的输出10 ?