并行实现

原文http://www.altdevblogaday.com/2011/11/22/parallel-implementations/

by  John Carmack

我一直都在“无畏的编码”,勇敢地干掉所有我认为有更好解决方式的东西。甚至于我为此感到一点点骄傲:“我不怕承受作正确事情所带来的后果!”当然,诚实的讲,这样的后果常常会撂倒一个新手,因为他们需要对付那些因此而无法工作的愤怒的开发者。

当然,如果这些改动真的是灾难性的,你可以通过源代码控制工具回滚,但是如果你的改动真的带来了好的效果,尽管其中包含着痛苦,你还是会希望继续前进。更微妙的是,总是有各种情况阻止你对新方法和老方法进行真实的比较。由于回滚代码重新构建运行测试是一件痛苦的事情,就算你怀疑你的代码在一些你重写时没有考虑到的特殊情况下会出问题,你也不会希望经常这么作。

现在当我实现一个新的想法时,我尝试着不去修改已有的代码,而是将其与原有想法并存。这样使得对两个实现进行真实的比较变得容易,并且如果新的实现中有问题,回到原来稳定的实现也变得简单了。在控制台中改变一个变量来获的不同的实现,比运行老的exe并且回滚代码重新构建方便的多。

对于一些任务这是显而易见的。如果你有一个ray tracer,很容易就可以实现一个允许Trace()函数使用各种后端实现的接口,比如kD tree,BVH,BSP。同样的也可以使处理代码为各种后端实现构建他们使用的加速数据结构。如果丢失了一些像素,切换到其他实现再试试。

然而,这个方法在其他方面更具威力。这些年我已经做了很多从软件渲染引擎到硬件加速的转换工作。过去,我必须从头开始,首先实现环境渲染,接着是角色,然后是特效。总是会有一些小的特性被漏掉。比较两个实现必须在两个系统上同时进行游戏。在最后两次转换过程中,我先让软件渲染引擎在新的系统上跑起来,这样所有的东西都可以在低帧速率下得以测试。然后并行这实现硬件加速,使两种方案在任何时候都可以立即切换。对于一个在windows模拟器中开发的移动版OpenGL ES应用程序,我打开一个独立的硬件加速窗口,使我可以同时看到两种实现。这是开发中的一个重大胜利。

如果你正在处理的任务可以被表示为一个简单的将输入处理为一个输出的纯函数(pure function,函数时编程),将其切换成不同的实现非常简单。如果是一个需要维护内部状态或者具有多个入口点的系统,在切换时就要格外小心了。如果这个系统比较混乱,内部使用许多对其他系统的调用来维持平行状态改变,那就应该在做平行实现前先对系统做一下清理工作。

我一般会把并行实现分为两类:参考实现,小而简单,会持续维护。实验性实现,你希望获得成功,但在你对功能和改进有足够信心之前,先用其他的实现替代几个星期。

在构建实验性实现时,完全可能违反一些常规的好的编码规则--拷贝,粘贴,查找替换重命名可以作为一个好的开始方法。在保持原有的代码能正常工作的前提下,勇敢的拷贝吧。为了方便,经常需要给已有代码传递一些选项,而不是完整的做一个并行实现。这是一个灰色地带,我一直倾向于找到哪些由于使用选项方法而搞乱两个版本的额外路径复杂度,而且需要在两个实现中做一定成都的妥协。

每次我使用这个并行实现方法时,都会感觉非常的受益,并且现在我更倾向于使用适合这个方法的编码风格。
强力推荐。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章 计算机体系结构的基本概念 1.1 引论 1.2 计算机体系结构的概念 1.2.1 计算机系统中的层次概念 1.2.2 计算机体系结构 1.2.3 计算机组成和计算机实现技术 1.3 计算机体系结构的发展 1.3.1 存储程序计算机体系结构及其发展 1.3.2 计算机的分代和分型 1.3.3 应用需求的发展 1.3.4 计算机实现技术的发展 1.3. 5 体系结构的生命周期 1.4 计算机体系结构中并行性的发展 1.4.1并行性概念 1.4.2 提高并行性的技术途径 1.5 定量分析技术基础 1.5.1 计算机性能的评测 1.5.2 测试程序 1.5.3 性能设计和评测的基本原则 1.5.4 CPU的性能 1.6 影响计算机体系结构的成本和价格因素 1.6.1 集成电路的成本 1.6.2 计算机系统的成本和价格 1.7 小结习题一第二章 计算机指令集结构设计 2.1 指令集结构的分类 2.1.1 指令集结构的分类 2.1.2 通用寄存器型指令集结构分类 2.2 寻址技术 2.3 指令集结构的功能设计 2.3.1 CISC计算机指令集结构的功能设计 2.3.2 RISC计算机指令集结构的功能设计 2.3.3 控制指令 2.4 操作数的类型、表示和大小 2.5 指令集格式的设计 2.5.1 寻址方式的表示方法 2.5.2 指令集格式的选择 2.6 编译技术与计算机体系结构设计 2.6.1 现代编译器的结构和相关技术 2.6.2 现代编译技术对计算机体系结构设计的影响 2.6.3 计算机体系结构对当前编译技术的影响 2.7 DLX指令集结构 2.7.1 DLX指令集结构 2.7.2 DLX指令集结构效能分析 2.8 小结习题二第三章 流水线技术 3.1 流水线的基本概念 3.1.1 流水线的基本概念 3.1.2 流水线的分类 3.2 DLX的基本流水线 3.2.1 DLX的一种简单实现 3.2.2 基本的DLX流水线 3.2.3 流水线性能分析 3. 3 流水线中的相关 3.3.1 流水线的结构相关 3.3.2 流水线的数据相关 3.3.3 流水线的控制相关 3.4 流水线计算机实例分析(MIPS R4000) 3.4.1 MIPS R4000整型流水线 3.4.2 MIPS R4000浮点流水线 3.4.3 MIPS R4000流水线的性能分析 3.5 向量处理机 3.5.1 向量处理方式和向量处理机 3.5.2 向量处理机实例分析 3.6 小结习题三第四章 指令级并行 4.1 指令级并行的概念 4.1.1 循环展开调度的基本方法 4.1.2 相关性 4.2 指令的动态调度 4.2.1 动态调度的原理 4.2.2 动态调度算法之一:记分牌 4.2.3 动态调度算法之二:Tomasulo算法 4.3 控制相关的动态解决技术 4.3.1 减少分支延迟:分支预测缓冲技术 4.3.2 进一步减少分支延迟:分支目标缓冲 4.3.3 基于硬件的推断执行 4.4 多指令流出技术 4.4.1 超标量技术 4.4.2 多指令流出的动态调度 4.4.3 超长指令字技术 4.4.4 多流出处理器受到的限制 4.5 小结习题四第五章 存储层次 5.1 存储器的层次结构 5.1.1 从单级存储器到多级存储器 5.1.2 存储层次的性能参数 5.1.3 “Cache—主存”和“主存—辅存”层次 5.1.4 存储层次的四个问题 5.2 Cache基本知识 5.2.1 映象规则 5.2.2 查找方法 5.2.3 替换算法 5.2.4 写策略 5.2.5 Cache的结构 5.2.6 Cache性能分析 5.2.7 改进Cache性能 5.3 降低Cache失效率的方法 5.3.1 增加Cache块大小 5.3.2 提高相联度 5.3.3 Victim Cache 5.3.4 伪相联Cache 5.3.5 硬件预取技术 5.3.6 由编译器控制的预取 5.3.7 编译器优化 5.4 减少Cache失效开销 5.4.1 让读失效优先于写 5.4.2 子块放置技术 5.4.3 请求字处理技术 5.4.4 非阻塞Cache技术 5.4.5 采用两级Cache 5.5 减少命中时间 5.5.1 容量小,结构简单的Cache 5.5.2 虚拟Cache 5.5.3 写操作流水化 5.5.4 Cache优化技术小结 5.6 主存 5.6.1 存储器技术 5.6.2 提高主存性能的存储器组织结构 5.7 虚拟存储器 5.7.1 虚拟存储器基本原理 5.7.2 快表(TLB) 5.7.3 页面大小的选择 5.8 进程保护和虚存实例 5.8.1 进程保护 5.8.2 页式虚存举例:Alpha AXP的存储管理和21064的TLB 5.9 Alpha AXP 21064存储层次 5.10 小结习题五第六章 输入输出系统 6.1 概述 6.2 存储设备 6.2.1 磁盘设备 6.2.2 磁带设备 6.2.3 光盘设备 6.3 总线 6.3.1 总线分类 6.3.2 总线基本工作原理 6.3.3 总线使用 6.3.4 总线标准和实例 6.3.5 设备的连接 6.3.6 CPU与I/O处理的匹配 6.4 通道处理机 6.4.1 通道的作用和功能 6.4.2 通道的工作过程 6.4.3 通道种类 6.4.4 通道中的数据传送过程 6.4.5 通道的流量分析 6.5 I/O与操作系统 6.5.1 I/O和Cache数据一致性 6.5.2 DMA和虚拟存储器 6.6 I/O系统设计 6.7 小结习题六第七章 多处理机 7.1 引言 7.1.1 并行计算机体系结构的分类 7.1.2 通信模型和存储器的结构模型 7.1.3 通信机制的性能 7.1.4 不同通信机制的优点 7.1.5 并行处理面临的挑战 7.1.6 并行程序的计算/通信比率 7.2 多处理机的存储器体系结构 7.2.1 集中式共享存储器体系结构 7.2.2 分布式共享存储器体系结构 7.3 互连网络 7.3.1 互连网络的性能参数 7.3.2 静态连接网络 7.3.3 动态连接网络 7.4 同步与通信 7.4.1 同步机制 7.4.2 大规模机器的同步 7.5 并行化技术 7.5.1 并行化的基本策略 7.5.2 并行语育与编译器 7.6 多处理机实例 7.6.1 Challenge多处理机系统 7.6.2 Origin 20007.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值