当前位置: 首页 > 知识库问答 >
问题:

处理器行为解释

班宏毅
2023-03-14

问了这个问题后,我很困惑,于是决定为一个C编译器程序构建类似的测试。这是我的代码:

#include <stdio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>

#define SUMMATIONS 20000000

int main() {

    static int speedups[2101] = { 0 };

    srand((unsigned)time(NULL));

    while (1) {

        unsigned int t1, t2, t3, t4;
        signed int tmp, i, n1, n2;

        // Slow version
        t1 = clock();
        for (n1 = rand() % 50, i = 0; i < SUMMATIONS; i++) {
            n1 += 3 * i * i;
        }
        t2 = clock();

        // Optimized version
        t3 = clock();
        for (n2 = rand() % 50, i = 0; i < SUMMATIONS; i++) {
            n2 += i * i;
        }
        n2 *= 3;
        t4 = clock();

        // gather speedup statistics
        if ((int)(t2 - t1) != 0) {
            tmp = (int)(100.0f * ((float)(t2 - t1) - (float)(t4 - t3)) / (float)(t2 - t1));
            tmp = tmp < -100 ? -100 : tmp > 100 ? 100 : tmp;
            tmp = (tmp >= 0 ? 1000 : 2000) + abs(tmp);
            speedups[tmp]++;
        }

        // output statistics
        for (i = 0; i < 2101; i++) {
            if (speedups[i] != 0) {
                char s = i / 1000 == 1 ? '+' : i / 1000 == 2 ? '-' : '?';
                printf("%c%i : %i\n", s, i % 1000, speedups[i]);
            }
        }
        printf("error %i ******************\n", abs(n2-n1));

    }

    return 0;
}

使用选项-o3-march=native在GCC下编译

测试代码被更改,这样错误值只能在运行时知道(而不能在编译时知道),这样GCC优化器就不能删除循环的代码。

我们应该期待CPU的加速吗?(正如GCC编译程序预测的那样)

共有1个答案

魏硕
2023-03-14

我们应该期待CPU的加速吗?

不,通过选择使用高级语言,您就放弃了期望与性能相关的任何内容的权利。

您可能会假设(但不期望)第一个版本在循环中有一个额外的乘法(额外的3*),因此可能会有与该乘法相关的额外成本。

 类似资料:
  • 一、简述 在使用 HBase 时,如果你的数据量达到了数十亿行或数百万列,此时能否在查询中返回大量数据将受制于网络的带宽,即便网络状况允许,但是客户端的计算处理也未必能够满足要求。在这种情况下,协处理器(Coprocessors)应运而生。它允许你将业务计算代码放入在 RegionServer 的协处理器中,将处理好的数据再返回给客户端,这可以极大地降低需要传输的数据量,从而获得性能上的提升。同时

  • 了解处理器硬件 要想深入理解ucore,就需要了解支撑ucore运行的硬件环境,即了解处理器体系结构(了解硬件对ucore带来影响)和机器指令集(读懂ucore的汇编)。ucore目前支持的硬件环境是基于Intel 80386以上的计算机系统。更多的硬件相关内容(比如保护模式等)将随着实现ucore的过程逐渐展开介绍。

  • 本文向大家介绍深入理解C预处理器,包括了深入理解C预处理器的使用技巧和注意事项,需要的朋友参考一下 C 预处理器不是编译器的组成部分,是编译过程中一个单独的步骤。C预处理器只是一个文本替换工具,它会指示编译器在实际编译之前完成所需的预处理。 所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始。 下表包含所有重要的预处理器指令: 指令 描述 #

  • 建筑格拉德尔 注释 加工机 \资源\META-INF\javax.annotation.processing.处理器 注释消费者 建筑格拉德尔 这应该是一个非常简单的注释处理器,只是打印调试语句。对我来说,这一切似乎都是正确的,但是在我构建/运行项目2时没有运行。我也尝试过覆盖和。那没有做任何事情。也尝试过没有,那也没有改变任何事情。 编辑:为什么我可以获得

  • Spring的处理器异常解析器HandlerExceptionResolver接口的实现负责处理各类控制器执行过程中出现的异常。某种程度上讲,HandlerExceptionResolver与你在web应用描述符web.xml文件中能定义的异常映射(exception mapping)很相像,不过它比后者提供了更灵活的方式。比如它能提供异常被抛出时正在执行的是哪个处理器这样的信息。并且,一个更灵活

  • Apache NIFI“ExecutesQL处理器”能否以“X”MB为单位流式传输大量的选择结果?