首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

操作系统核心原理-1.操作系统导论

(2)编译系统   我们写好了代码,但是由于计算机不认识高级语言编写的程序,需要编译成计算机能够识别的机器语言,这就需要编译器和汇编器的帮助。   ...About:进程需要在计算机芯片即CPU上执行才算是真正在执行,而将进程调度到CPU上运行也是由操作系统完成的,这里也就不难理解为什么进程管理会在我们的教科书中排在最重要的位置了。   ...(2)管理者   操作系统管理计算机上的软硬件资源,如CPU、内存、磁盘等,使得不同用户之间或者同一用户的不同程序之间可以安全有序地共享这些硬件资源。   ...那么,问题来了,如何让用户很好地利用这些硬件资源呢?这就是分块(Parcel Out),把硬件分块给应用程序使用。...3.4 I/O管理   即如何分配输入输出设备给应用和用户,也称为设备管理,也就是管理输入输出设备。

1.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【从零开始学深度学习编译器】二,TVM中的scheduler

    同时,在高性能计算方面TVM提供了多种调度源语(scheduler),包含了大多数常见的优化手段如算子融合,读写缓存,分块计算,并行计算等等,这些计算方法都可以通过scheduler进行实现。...) pack,kernel提前做,输入NC4HW4,neon汇编优化,8x4分块 5.5gflops 50.5% 1 conv1x1s1.h(version4) idea from megengine...pack,kernel提前做,输入NC4HW4,neon汇编优化,12x4分块 5.2gflops 47.8% 1 可以看到虽然这些实现都完成了矩阵乘法这个计算任务,也就是说输入输出都是完全相同的,但在计算过程中却使用了一系列不同的优化手段...这些是特定于GPU的构造,允许我们生成在GPU上运行的代码。...这也是我们之前探索矩阵乘法时,为什么要将K维放在最外层,而不是将M放在最外层的原因。

    2K72

    评估与优化RAG指南:提高准确性与质量的最佳实践

    你可以在 Phoenix 中直观地查看这些步骤,帮助识别性能瓶颈和错误。你可以定义 “评估器[4]” 来使用 LLM 评估输出的质量、检测幻觉和检查答案的准确性。...为什么你的 RAG 系统可能表现不佳 你在向向量数据库中导入数据时不当 不当的数据导入可能导致丢失重要的上下文信息,而这些信息对于生成准确和连贯的响应至关重要。...它应该与嵌入模型的令牌限制对齐。 确保适当的分块重叠: 这有助于通过在不同分块之间共享数据点来保持上下文。可以采用去重和内容规范化等策略来管理这一点。...制定适当的分块/文本拆分策略: 确保你的分块/文本拆分策略适应你的数据类型(例如 HTML、Markdown、代码、PDF)和使用场景。...例如,法律文档可能按标题和小节分块,医学文献可能按句子边界或关键概念拆分。 图 4:你可以使用诸如ChunkViz[6] 之类的工具来可视化不同的分块拆分策略、分块大小和分块重叠情况。

    26810

    将矩阵乘法的性能提升200倍!AutoKernel算子优化工具正式开源

    1 AutoKernel特色 低门槛: 无需底层优化汇编的知识门槛 简单易用: 提供docker环境,无需安装环境,plugin一键集成到推理框架Tengine 高效率: 无需手写优化汇编,一键生成优化代码...无需手工撸代码,编写繁杂冗长的底层汇编代码,只需十几行简洁的调度代码。 ? 在详细讲解优化步骤前,我们先谈谈优化的本质。我们在谈”优化“的时候,计算机底层做了什么?优化的”瓶颈“是什么?...为什么通过一波”优化操作“,性能就能提升呢?AutoKernel使用的Halide是如何实现自动优化的呢?.../build.sh 7 下图展示了在Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz的电脑上的优化效果,无需手工撸代码,无需编写繁杂冗长的底层汇编代码,只需十几行简洁的调度代码...对一个循环并行化是把循环的每次迭代分给多个线程或者处理器去同时处理,每个线程处理通过代码段(loop body),但是处理不同的数据。

    1.3K20

    清华&旷视让全连接层“内卷”,卷出MLP性能新高度

    用卷积强化全连接,使之具有局部性又不失全局性 为什么要用卷积来强化全连接? 因为卷积网络具有局部先验特性,识别效果很不错。...首先将输入特征进行分块,分块会打破相同通道不同分块之间的相关性,因此全局感知(Global Perceptron)对每个分块添加相关性。...局部感知(Local Perceptron )将分块特征经由卷积核大小分别为1、3、5,、7的卷积层进行处理 ,将所有卷积分支的输出与分块感知的输出相加作为最终的输出 。...思路和RepVGG一样,利用了结构重参数化 (通过参数的等价转换实现结构的等价转换),将局部感知和分块感知的输出合并到全连接层进行推理,并去除卷积。...),就可以在推理阶段将这些卷积等效地去掉。

    44720

    【汇编语言】包含多个段的程序(二)—— 将数据、代码、栈放入不同的段

    但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。...解决办法 所以,应该考虑用多个段来存放数据、代码和栈。 怎样做呢? 我们用和定义代码段一样的方法来定义多个段,然后在这些段里面定义需要的数据,或通过定义数据来取得栈空间。 3....示例代码 具体做法如下面的程序所示,这个程序将数据、栈和代码放到了不同的段中。...3.1.1 定义多个段的方法 这点,我们从程序中可明显地看出,定义一个段的方法和前面所讲的定义代码段的方法没有区别,只是对于不同的段,要有不同的段名。...在汇编源程序中,可以定义许多的段,比如在上面的示例程序中,定义了3个段,“code”、“data”和“stack”。我们可以分别安排它们存放代码、数据和栈。

    28310

    多样性计算时代,鲲鹏迁移和调优关键技术全解读

    1鲲鹏 DevKit 中汇编翻译特性的应用和实现 编译器无法编译源码中其他平台的汇编代码,因此如何高效识别 x86 中的汇编代码并快速迁移到鲲鹏平台上,是鲲鹏生态快速建设和拓展亟需解决的一个技术课题。...汇编注解解决了汇编样式多样的问题,局部异构平台反编译解决平台差异问题,代码质量由编译器的编译优化和代码生成完成。...比如在汇编代码的识别上,如果用传统的方式去查找,会漏掉很多汇编代码,因此需要使用编译器的语法能力,如 LLVM 的 Clang-Tidy 工具框架,通过在源代码里生成的抽象语法树,找到汇编代码并进行自动翻译...,用语法解析的方式避免代码漏扫,从而精准地识别需要迁移的汇编代码。...至于复杂的汇编,虽然情况各有不同,但也可以一键翻译成为鲲鹏的汇编代码。

    72830

    万文长字带你从CUDA初学者的角度入门

    Tiling:如何做矩阵分块?即如何将一个巨大的矩阵乘任务合理的分配到 GPU 的不同线程上。 Thread 级优化:在 Thread 这个维度,我们能做什么优化?...(这也是为什么这篇文章叫传统 CUDA GEMM) • 使用安培架构新提出的 async memcpy。 • CUDA 语法知识。 • 汇编。...同时我们也注意到, M 和 N 越大的情况下,提升效果越发显著,这也是为什么我们希望每一个线程负责的分块大一点比较好。...同时现代一点的编译器也能在一定程度上根据生成的汇编交叉排列计算和访存达到延迟覆盖的目的。而向量内积的方案需要把整个 k 维度展开才能看到这些潜在的访存合并机会。...当然现在还是有很多问题没有解决的,如 split K、长尾问题、分块细调等等,这些权当是一些未来展望了。

    2.9K31

    为什么C C++编译要要先完成汇编?

    为什么 C/C++ 编译需要先完成汇编 在学习或使用 C/C++ 编程语言时,我们会注意到编译过程通常分为多个阶段,其中一个重要阶段是将代码转换为汇编语言。为什么 C/C++ 的编译需要先完成汇编?...汇编作为目标代码的桥梁 在目标代码生成阶段,编译器可以选择直接生成机器码,但由于以下原因,选择汇编语言作为中间桥梁更为合适: 硬件适配性:不同的硬件架构有不同的机器码指令集,而汇编语言是机器码的文本表示...三、从实践的角度看:编译过程中为什么保留汇编阶段 1. 减少复杂度和错误率 直接将高级语言转换为机器码需要处理大量硬件细节,不同架构的机器码差异非常大。...只需将输出的汇编代码交给适配不同架构的汇编器即可,而无需在编译器内部处理所有硬件的细节。 3. 支持调试和优化 生成汇编代码后,开发者可以检查汇编代码,分析程序性能或调试问题。...其原因包括: 兼容性: 许多工具链仍依赖汇编语言的输入,例如 GNU 汇编器 (as)。 汇编语言的输出格式是跨平台工具链的通用标准。

    16810

    【Linux系统编程】——深入理解 GCCG++ 编译过程及常用选项详解

    -o:指定输出文件名,.i 文件为经过预处理的代码文件。 编译(Compilation) 编译阶段会: 检查代码的合法性(如语法错误)。 将代码翻译成汇编语言。...以下是一些常用选项的介绍: 基本编译选项 -E:仅执行预处理。 -S:执行编译,生成汇编代码,不进行汇编。 -c:执行汇编,生成目标代码,不进行链接。 -o :指定输出文件名称。...调试与发布 在开发和调试阶段,通常需要输出大量的日志信息,但在发布版本中不希望这些日志被编译进去。条件编译可以帮助实现这一需求。...为什么非得把语言变成汇编 编译器的职责 编译器的职责是将高级语言(如 C/C++)编写的程序,转换为计算机可以理解并执行的低级语言(机器代码)。...如果编译器直接生成机器码,可能难以适配不同的平台。生成汇编语言后,可以通过调用汇编器生成适合目标平台的机器码。

    51020

    关于深度学习编译器,这些知识你需要知道

    神经网络编译器: 其输入是深度学习训练框架训练出来的模型定义文件,输出是能够在不同硬件高效执行的代码。 ? 从上至下由四个层级组成: 1....TVM全称为Tensor Virtual Machine,属于算子层级,主要用于张量计算,提供独立于硬件的底层计算中间表示,采用各种方式(循环分块,缓存优化等)对相应的计算进行优化。...Schedule部分则是告诉机器什么时候分配内存,如何计算(分块计算还是顺序计算)——目前已经提供了一些调度策略。 ? ? 不同调度策略考虑重复冗余计算和局部性(locality)的权衡。...AutoKernel的输入是算子的计算描述(如Conv、Poll、Fc),输出是经过优化的加速源码。 这一工具的开发旨在降低优化工作的门槛,不需要有底层汇编的知识门槛,不用手写优化汇编。...可通过直接调用开发的工具包便可生成汇编代码。同时还提供了包含CPU、GPU的docker环境,无需部署开发环境,只需使用docker便可。

    1.5K20

    关于跨平台的一些认识

    CPU和平台环境,编译输出的汇编代码也不同,我们这里仅作为示例。...而在他们输入的0和1中,有些代表的是指令,这些是有固定含义和编码的。也是芯片能识别的。而另一些是数据。这些不同的程序的数据自然是不同的。...cpu的指令集不同, 不同平台编译出来的结果格式都不同,那么我们可以在各个平台上运行虚拟机,然后我们制定某种编译结果的输出格式,我们的输出了某种格式的结果,直接在虚拟机上运行。这样不就ok了嘛。。...在部分的商用虚拟机中,Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”(Hot Spot Code)。...为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Just In Time Compiler,简称JIT编译器

    57430

    为什么这段代码输出的是”Hello World”

    Stackoverlfow.com上有一篇有趣的讨论帖: 在这篇帖子里提到了如下的程序: 明明是在程序里使用了java.util.Ramdom()函数产生随机数,为什么每次打出的结果都是Hello world...请务必要独立思考后再看下面的内容哦~ —————–独立思考的分割线————————— OK,假如你通过独立思考了以后有了答案,那么可以参照一下下面的各种理解,这些都是来自stackoverflow对此问题的回复...这就是为什么每次运行该程序都会产生同样的结果的原理啦~ 当然,关于这个话题,高手林立的Stackoverflow上是不缺乏懂行的专家和见解的。...还有的人就非常精辟地指出了,这是计算机所谓的“伪随机数”问题(详细见扩展阅读),更有部分Geek的回复者从计算机理论和概率论的角度说明了,应该如何找到这些神奇的“随机数种子”。...尤其是在复杂的计算环境下的高质量随机数的产生,需要牵涉到非常高深的计算科学和数学方面的理论研究。 在计算机随机数产生的理论研究上,美籍华人姚期智(目前任职于清华大学)是世界顶尖的专家。

    1.2K20

    GNU C 内联汇编介绍

    2、\n 用于指令换行,\t使 GCC 编译的时候产生的汇编指令格式保持规范。 GCC 默认使用 AT&T 格式的汇编语法 它与 intel 的汇编语法之间稍有不同。...简单说两点不同的地方: AT&T 汇编在操作寄存器时需要在前面加一个 '%' 符号,而 intel 的不用。...由于在 C 代码中嵌入汇编时,写在字符串中,由于 '%' 在 C 语言中是特殊字符,所以为什么在第一个例子中寄存器前加了两个 '%'....可参见相关描述 AT&T 汇编的书籍。 ---- 输出变量列表 1、输出变量列表是描述,在内嵌的汇编指令中将哪些值输出到 C 代码环境中的哪个变量中。...---- 破坏寄存器列表 1、这一行告诉 GCC 在内联的汇编代码中,哪些寄存器可能会被使用到(显式/隐式)。那么 GCC 就会在进入内联汇编之前将这些寄存器保存起来,最后再恢复。

    2.1K10

    汇编语言知识总结

    介绍 汇编是一类编程语言,每种cpu对应一种cpu语言,这些语言语法大同小异,指令集有所不同, 那么这些cpu语言统称为汇编语言,与java,c++,python等高级语言无异, 只不过汇编更加接近硬件...,代码执行效率高 二进制>汇编>c>java 所有编程语言都有相应语法,汇编也不例外, 语法是人定的,只是一套公共协议,目的是方便程序员进行程序开发 为什么要学汇编 了解程序的本质, 利于日常开发 从事硬件相关开发工作..., 那么cpu在进行数据交换时明显一个寄存器是不够的, 在8086cpu中,通用寄存器有好几个,比如ax,bx,cx,dx 这些名称是固定的, 根据cpu的不同名称也各不相同, 咱们只需知道每种cpu都有相应的通用寄存器...或者__asm "汇编指令" :"=限制符"(输出参数) ,"=限制符"(输出参数) :"限制符"(输入参数) :保留列表 ) ;volatile是可选关键字,表示禁止编译器对汇编代码进行优化 ;汇编指令之间使用...g 任意寄存器,内存,立即数 为什么有些汇编语法不一致 C语言外链汇编 新建一个汇编原文件, linux平台.s结尾 ,windows平台.asm结尾 ;外链汇编 ;以下使用的是AT&

    2.9K20

    为什么这段代码输出的是”Hello World”

    Stackoverlfow.com上有一篇有趣的讨论帖: 在这篇帖子里提到了如下的程序: 明明是在程序里使用了java.util.Ramdom()函数产生随机数,为什么每次打出的结果都是Hello world...请务必要独立思考后再看下面的内容哦~ —————–独立思考的分割线————————— OK,假如你通过独立思考了以后有了答案,那么可以参照一下下面的各种理解,这些都是来自stackoverflow对此问题的回复...这就是为什么每次运行该程序都会产生同样的结果的原理啦~ 当然,关于这个话题,高手林立的Stackoverflow上是不缺乏懂行的专家和见解的。...还有的人就非常精辟地指出了,这是计算机所谓的“伪随机数”问题(详细见扩展阅读),更有部分Geek的回复者从计算机理论和概率论的角度说明了,应该如何找到这些神奇的“随机数种子”。...尤其是在复杂的计算环境下的高质量随机数的产生,需要牵涉到非常高深的计算科学和数学方面的理论研究。 在计算机随机数产生的理论研究上,美籍华人姚期智(目前任职于清华大学)是世界顶尖的专家。

    1.2K20

    深度课堂:全角度解读神经网络编译器

    这些各训练框架训练出来的模型要如何部署到不同的终端硬件呢,这就需要深度学习神经网络编译器来解决。 在介绍神经网络编译器之前,我们先简单回顾下传统编译器。...编译器的输入/输出: 传统编译器的输入是高级编程语言,输出是目标硬件的机器码。神经网络编译器的输入是深度学习训练框架训练出来的模型定义文件,输出是能够在不同硬件高效执行的代码。...Schedule部分则是告诉机器什么时候分配内存,如何计算(分块计算还是顺序计算)——目前已经提供了一些调度策略。 ? ? 不同调度策略考虑重复冗余计算和局部性(locality)的权衡。...AutoKernel的输入是算子的计算描述(如Conv、Poll、Fc),输出是经过优化的加速源码。 这一工具的开发旨在降低优化工作的门槛,不需要有底层汇编的知识门槛,不用手写优化汇编。...可通过直接调用开发的工具包便可生成汇编代码。同时还提供了包含CPU、GPU的docker环境,无需部署开发环境,只需使用docker便可。

    1.9K10

    Python 为什么不设计 do-while 循环结构?

    那么,为什么 Python 不提供这种语法结构呢,这种现状的背后有何种设计考量因素呢?...它的使用场景也许不多,但是,跟普通的 while 循环或者 for 循环语法的“条件前置”思想不同,它体现的是一种“条件后置”的编程逻辑,也是一种控制循环的常见方式。...它们的关系似乎有点像 C/C++ 这些语言中的i++与++i操作的区别,在某些特殊场合中,也许会更为高效。...这种写法主要用在宏函数的定义中,可以解决宏代码块的编译问题,使代码按照我们的意图而合理分块。 另外,do {...} while (0) 结合 break 使用,还可以实现很优雅的跳转控制效果。...最后还有一点,在汇编层面,do-while 比 while 更接近汇编语言的逻辑,可以节省使用指令,在过去的低内存时代,算得上是一种优化写法。

    1.3K10
    领券