一级缓存的命中率最高的鱼钩与一级缓存的架构有关吗

分布式架构系统生成全局唯一序列号的一个思路_乐投网-大数据、人工智能、金融科技第一干货网_创新TMT新媒体平台
分布式架构系统生成全局唯一序列号的一个思路
作者:丁宜人
分布式架构下,唯一序列号生成是我们在设计一个系统,尤其是数据库使用分库分表的时候常常会遇见的问题。当分成若干个sharding表后,如何能够快速拿到一个唯一序列号,是经常遇到的问题。
一、相关背景
分布式架构下,唯一序列号生成是我们在设计一个系统,尤其是数据库使用分库分表的时候常常会遇见的问题。当分成若干个sharding表后,如何能够快速拿到一个唯一序列号,是经常遇到的问题。
在携程账号数据库迁移MySql过程中,我们对用户ID的生成方案进行了新的设计,要求能够支撑携程现有的新用户注册体量。
本文通过携程用户ID生成器的实现,希望能够对大家设计分库分表的唯一id有一些新的思路。
二、特性需求
支持高并发
能够体现一定属性
高可靠,容错单点故障
三、业内方案
生成ID的方法有很多,来适应不同的场景、需求以及性能要求。
常见方式有:
1、利用数据库递增,全数据库唯一。
优点:明显,可控。
缺点:单库单表,数据库压力大。
2、UUID, 生成的是length=32的16进制格式的字符串,如果回退为byte数组共16个byte元素,即UUID是一个128bit长的数字,一般用16进制表示。
优点:对数据库压力减轻了。
缺点:但是排序怎么办?
此外还有UUID的变种,增加一个时间拼接,但是会造成id非常长。
3、twitter在把存储系统从MySQL迁移到Cassandra的过程中由于Cassandra没有顺序ID生成机制,于是自己开发了一套全局唯一ID生成服务:Snowflake。
41位的时间序列(精确到毫秒,41位的长度可以使用69年)
10位的机器标识(10位的长度最多支持部署1024个节点)
12位的计数顺序号(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号) 最高位是符号位,始终为0。
优点:高性能,低延迟;独立的应用;按时间有序。
缺点:需要独立的开发和部署。
4、Redis生成ID
当使用数据库来生成ID性能不够要求的时候,我们可以尝试使用Redis来生成ID。这主要依赖于Redis是单线程的,所以也可以用生成全局唯一的ID。可以用Redis的原子操作INCR和INCRBY来实现。
可以使用Redis集群来获取更高的吞吐量。假如一个集群中有5台Redis。可以初始化每台Redis的值分别是1,2,3,4,5,然后步长都是5。各个Redis生成的ID为:
A:1,6,11,16,21
B:2,7,12,17,22
C:3,8,13,18,23
D:4,9,14,19,24
E:5,10,15,20,25
比较适合使用Redis来生成每天从0开始的流水号。比如订单号=日期+当日自增长号。可以每天在Redis中生成一个Key,使用INCR进行累加。
不依赖于数据库,灵活方便,且性能优于数据库。
数字ID天然排序,对分页或者需要排序的结果很有帮助。
使用Redis集群也可以防止单点故障的问题。
如果系统中没有Redis,还需要引入新的组件,增加系统复杂度。
需要编码和配置的工作量比较大,多环境运维很麻烦,
在开始时,程序实例负载到哪个redis实例一旦确定好,未来很难做修改。
5.&&&Flicker的解决方案
因为MySQL本身支持auto_increment操作,很自然地,我们会想到借助这个特性来实现这个功能。
Flicker在解决全局ID生成方案里就采用了MySQL自增长ID的机制(auto_increment + replace into + MyISAM)。
6.还有其他一些方案,比如京东淘宝等电商的订单号生成。因为订单号和用户id在业务上的区别,订单号尽可能要多些冗余的业务信息,比如:
滴滴:时间+起点编号+车牌号
淘宝订单:时间戳+用户ID
其他电商:时间戳+下单渠道+用户ID,有的会加上订单第一个商品的ID。
而用户ID,则要求含义简单明了,包含注册渠道即可,尽量短。
四、最终方案
最终我们选择了以flicker方案为基础进行优化改进。具体实现是,单表递增,内存缓存号段的方式。
首先建立一张表,像这样:
SEQUENCE_GENERATOR_TABLE
1&&& 192.168.1.1
其中id是自增的,stub是服务器ip
因为新数据库采用mysql,所以使用mysql的独有语法 replace to来更新记录来获得唯一id,例如这样:
REPLACE INTO SEQUENCE_GENERATOR_TABLE (stub) VALUES (&192.168.1.1&);
再用SELECT id FROM SEQUENCE_GENERATOR_TABLEWHERE stub = &192.168.1.1&;&& 把它拿回来。
到上面为止,我们只是在单台数据库上生成ID,从高可用角度考虑,接下来就要解决单点故障问题。
这也就是为什么要有这个机器ip字段呢?就是为了防止多服务器同时更新数据,取回的id混淆的问题。
所以,当多个服务器的时候,这个表是这样的:
5&&& 192.168.1.1
2&&& 192.168.1.2
3&&& 192.168.1.3
4&&& 192.168.1.4
每台服务器只更新自己的那条记录,保证了单线程操作单行记录。
这时候每个机器拿到的分别是5,2,3,4这4个id。
至此,我们似乎解决这个服务器隔离,原子性获得id的问题,也和flicker方案基本一致。
但是追根溯源,在原理上,方案还是依靠数据库的特性,每次生成id都要请求db,开销很大。我们对此又进行优化,把这个id作为一个号段,而并不是要发出去的序列号,并且这个号段是可以配置长度的,可以1000也可以10000,也就是对拿回来的这个id放大多少倍的问题。
OK,我们从DB一次查询操作的开销,拿回来了1000个用户id到内存中了。
现在的问题就是要解决同一台服务器在高并发场景,让大家顺序拿号,别拿重复,也别漏拿。
这个问题简单来说,就是个保持这个号段对象隔离性的问题。
AtomicLong是个靠谱的办法。
当第一次拿回号段id后,扩大1000倍,然后赋值给这个变量atomic,这就是这个号段的第一个号码。
atomic.set(n * 1000);
并且内存里保存一下最大id,也就是这个号段的最后一个号码
currentMaxId = (n + 1) * 1000;
一个号段就形成了。
此时每次有请求来取号时候,判断一下有没有到最后一个号码,没有到,就拿个号,走人。
Long uid = atomic.incrementAndGet();
如果到达了最后一个号码,那么阻塞住其他请求线程,最早的那个线程去db取个号段,再更新一下号段的两个值,就可以了。
这个方案,核心代码逻辑不到20行,解决了分布式系统序列号生成的问题。
这里有个小问题,就是在服务器重启后,因为号码缓存在内存,会浪费掉一部分用户ID没有发出去,所以在可能频繁发布的应用中,尽量减小号段放大的步长n,能够减少浪费。
经过实践,性能的提升远远重要于浪费一部分id。
如果再追求极致,可以监听spring或者servlet上下文的销毁事件,把当前即将发出去的用户ID保存起来,下次启动时候再捞回内存即可。
五、上线效果
运行5个多月,十分稳定。
SOA服务平均响应时间 0.59毫秒;
客户端调用平均响应时间2.52毫秒;
附流程图:
转载请注明出处乐投网。
1.乐投网遵循行业规范,转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源;
实时翻译成真!揭秘谷歌的 Pixel Buds 翻译耳
商机 | 大数据/政务云采购清单 招标7起,最高
NLP论文泛读之《教材在线评论的情感倾向性分
大数据人工智能领域从菜鸟到高手晋级指南
什么是数据中心的双层存储系统?
人脸识别解决方案服务商汉柏,为何能屡屡签约
大数据早报:深圳龙华区与中科院合作共建人工
Facebook大数据揭秘「子承父业」作者1天前技术经理, 大连农商银行金融企业“双模IT”趋势下,模式二即互联网金融核心系统建设难点探讨字数 5966阅读 34评论 0赞 1金融企业建设互联网金融核心必须面临的几方面问题。
1.金融行业面临今天的互联网模式,IT基础架构的演变应该朝着什么样的方向?
观点一(来自IBM)
1、银行的业务分类,线上的渠道类业务占比正在慢慢超过线下的业务; 2、服务提供的便利性,线下的业务受限于时间地点及服务提供人员,对于服务的提供远不如线上便捷快速。在互联网金融潮流的冲击下,人们对于服务便捷性的要求日益提升,在家就能办和必须去网点办的服务感知度差别还是巨大的,因此,线上渠道的扩展和线上业务的多样化应该是趋势。面对互联网金融的冲击,对于核心架构的改造,目前有三种声音,一种是双核心,也就是保留原有核心职能不变,新建一套互联网核心,来满足互联网应用的建设需求;其二是单核心,也就是继续沿用原有银行核心,在原有核心的基础上进行改造,使之既能满足传统核心稳定性的要求,又能满足互联网应用快速开发更迭的需求;其三是无核,核心功能扩散到整体基础架构,整体架构提供服务的整合,核心架构将作为整体架构的输入,这种架构业内也有银行再探讨。就这三种架构而言,双核心应该是最容易实现的,但仍然需要解决很多问题,比如,新老核心业务边界的划分,一二三类账户切分的问题等等,只有业务层面的东西梳理清楚了,IT架构才能更好地为业务服务。
观点二(来自商业银行)
我们应该清晰地感受到:
越来越多的自助终端削减了柜面的工作。
越来越多的线上支持减轻了面对面的审核、解答、评估等流程作业。
越来越多的银行业务通过手机银行等类似APPs实现了解决。
线上业务的数据挖掘工作对银行的驱动能力越来越强。
越来越多的银行开始感觉到随着电商平台的节奏来调整自身的运作模式。
在面对互联网模式的今天,不管我们是否承认,有很多东西已经潜移默化地在影响着我们。所以银行业自身来讲,其多年来的传统模式应该挪一挪重心了,我觉得。应该说银行的核心业务系统一直在改造过程中,从传统的各自为政到数据的大集中,从胖核心到瘦核心,从网银到收集银行再到微信银行,一直在随着事物的发展寻求改变。所以为了适应今天的互联网模式,这个改变我相信还得继续进行。
观点三(来自商业银行)
传统模式的IT架构要求的是稳固安全,互联网模式的IT架构要求的是快速创新。这个对传统行业提出的需求不仅仅是技术团队的变革,更要求的是流程和组织架构的变革。举个例子,传统金融行业的一个新系统上线可能经历的不仅仅是技术可行性的千锤百炼,更需要经历的是流程上的逐级审批,这是一个安全稳妥,又是一个冗长了过程。但是在互联网模式下,产品的价值提前在其快速创新和快速变现,假设你的产品不够新颖,假设你的产品发布不够快速,那么商机就会在互联网上稍纵即逝。市场不再像传统模式下因地域、行业、领域等不同形成天然的多个格局,而互联网上不存在这种天然的格局,大家需要去争去抢。争抢靠的就是快速IT驱动下的业务能力。
2.金融行业是不是一定要照搬互联网企业的IT架构模式?
观点一(来自IBM)
银行传统核心主要强调准确性、可靠性和稳定性,而互联网新核心主要满足业务的快速多样性,强调敏捷性和速度。两者不同的业务需求模式,决定了其在架构上的差异。传统核心可继续沿用已经经过多年验证的传统架构平台,商用平台+商用数据库。而互联网新核心为了满足其敏捷性和快速迭代的需求,可以沿用我们ppt中所陈述的大平台+小应用,也就是具有通用性的中间件、数据库或其他具有普适性的平台采用平台即服务的方式来提升平台的灵活性,而前端应用开发可采用容器等方式来提升其灵活性,满足快速开发和快速上线的需求。大平台小应用,避免原有的竖井式建设模式,提升整体IT架构的灵活性。
观点二(来自商业银行)
双模IT中稳态业务是集成式架构,敏态业务是微服务架构,这是最主要的区别。微服务架构主要是应用逻辑的拆分以及微服务模块化改造。传统模式的IT架构要求的是稳固安全,互联网模式的IT架构要求的是快速创新。这个对传统行业提出的需求不仅仅是技术团队的变革,更要求的是流程和组织架构的变革。举个例子,传统金融行业的一个新系统上线可能经历的不仅仅是技术可行性的千锤百炼,更需要经历的是流程上的逐级审批,这是一个安全稳妥,又是一个冗长了过程。但是在互联网模式下,产品的价值提前在其快速创新和快速变现,假设你的产品不够新颖,假设你的产品发布不够快速,那么商机就会在互联网上稍纵即逝。市场不再像传统模式下因地域、行业、领域等不同形成天然的多个格局,而互联网上不存在这种天然的格局,大家需要去争去抢。争抢靠的就是快速IT驱动下的业务能力。因为二者的运营模式、行业要求、人力配备完全不一样。而且也没有必要照搬互联网企业的模式,因为银行的业务模式跟互联网业务还是有很大差别的。传统银行业IT建设应该积极探索传统业务和互联网模式结合下的新业务模式的架构支持,并不是也不能完全否定传统核心业务的存在意义。就人力而言可能一个两个企业本身的IT人才储备并不能完全支撑新业务模式的发展,但是如果以行业为依托,在行业内实现资源的储备和共享是完全可以支撑的。当然这个事情不是某一个或两个企业就能促成的,需要整个行业的整体意识。
3.金融企业应该以什么样的视角去看待既有传统IT架构和互联网模式下的新架构之间的关系?
观点一(来自IBM)
互联网金融新核心的架构设计,我们总结了四个技术架构转型的考量重点: 第一个是核心系统的改造,们传统的核心应用是以稳定为首要目标,但是在快速满足业务扩展方面有着一些不足,针对于互联网金融的冲击,也就诞生了“双模IT”的理念,落到核心上,目前业内有三种声音:单核、双核和无核。其次,是应用平台的改造,无论是哪种核心架构,前端的应用都需要能够组件化,能够灵活部署,既能支持稳定的数据库霍家沟,也能支持快速扩展,比如容器化。应用一旦拆小,还采用原有的竖井式部署方式,那么竖井就变草丛了。目前我们已经看到平台再往paas层转型,是可操作可落地的有数据库即服务,消息即服务,加密即服务以及API统一管理平台等来实现统一的大平台为前端的小应用提供访问接口,简化管理和IT架构的复杂性。最后,作为银行架构,最重要的考量点是高安全,包括数据的安全性和架构的可靠性。数据一致性通常有两种方式,一种利用商用数据的能力来保证SID一致性要求,这一块相对比较成熟,第二种,不依赖于数据库,把状态的保持提升到应用层面或平层,就是所谓的柔性一致性,保证最终结果的一致性。比如业务场景中涉及财务的,我们需要强一致性保证,但是抢红包等就可以采用柔性一致性,混合架构的意义也就在于此。架构的可靠性一般通过两地三中心的架构去满足架构及平台的高可靠。
观点二(来自商业银行)
一、应用架构的发展思路1. 系统群保持原有总线架构,逐步将既有交易系统升级为耦合性低,扩展性及灵活性较强的应用架构。2. 探索既有核心系统的的新模式:总账分离、业务细分、模块儿分布式组合。3. 互联网金融业务产品开发面向服务式弹性开发模式发展。4. 线上数据的挖掘成为系统开发或者变化的主要驱动力。
二、基础架构的发展思路1. 交易系统逐步打破传统资源利用模式:硬件资源和应用系统绑定模式拆分。2. 外围平台存储架构转变为分布式存储架构,互联网金融平台根据数据特点引入对象存储架构。3. 互联网基础平台直接跨越到微服务资源利用模式:操作系统和应用的绑定拆分。4. 互联网区的网络架构由传统纵深式安全架构转变为扁平式软件定义网络架构。5. 结合大数据技术和数据挖掘技术实现线上数据的采集和分析,实现对产品创新驱动。
三、互联网模式的重点思路新一代的金融互联网应用应该向着轻量级、迭代速度快、伸缩能力强等几个方面发展。线上业务产品的创新、发布与升级需要有强有力的后台海量数据驱动力。基础架构上需要高弹性、高可用、高效率的平台来支撑新型互联网的新特点。管理上需要有自动化、流程化、智能化的管理平台来支撑新业务的敏捷性和灵活性。
4.传统金融行业在面临双模式的IT架构发展前提下,难点在哪里?
观点一(来自商业银行)首先阐述其整体变革难点:难点一:从业务逻辑上将核算模块儿和业务模块儿分离虽然业内在积极探索,但是工程相当复杂。难点二:不同业务之间的去耦同样是应用开发面临的一项巨大挑战。难点三:传统交易模式下的带有状态的长连接模式在相当长时间内还很难完全改变。
其次技术难点:
传统核心交易系统架构改造
难点一:从业务逻辑上将核算模块儿和业务模块儿分离虽然业内在积极探索,但是工程相当复杂。难点二:不同业务之间的去耦同样是应用开发面临的一项巨大挑战。难点三:传统交易模式下的带有状态的长连接模式在相当长时间内还很难完全改变。
新型互联网金融平台架构建设
难点一:如何定义模型(调度触发模型、应用注册模型、服务注册模型、资源调度模型)。难点二:如何保障系统整体高可用性,各个模块儿采用的分布式算法及集群模式并不统一,组合非常复杂。难点三:目前有比较成熟的资源调度软件,也有服务的调度软件,但是如何把服务和资源调度无缝衔接需要科学合理的设计。难点四:数据的承载,是依旧访问核心系统中的账务数据呢?还是在独立的互联网金融平台开辟新的数据空间?难点五:线上的数据如何利用?大数据工具只能完成采集,但是真正的业务分析还是要靠业务模型。
观点二(来自IBM)互联网金融要求IT架构能够满足敏捷上线,快速更迭的需求,因此在应用及平台方面,我们也需要进行一些改造,采用容器及微服务的架构目前是的主流方向,前端的应用都需要能够组件化,能够灵活部署,既能支持稳定的数据库霍家沟,也能支持快速扩展。应用一旦拆小,如果还采用原有的竖井式部署方式,那么竖井就变草丛了。目前我们已经看到平台再往paas层转型,是可操作可落地的有数据库即服务,消息即服务,加密即服务以及API统一管理平台等来实现统一的大平台为前端的小应用提供访问接口,简化管理和IT架构的复杂性。落到对IT的基础架构,无非是两个因素,“快”和“稳”。稳定是银行IT系统的核心保障,切实保障客户和企业信息及资金的准确安全及业务的持续运行。快是利用各种新兴技术及生态系统构建实现业务转型和服务模式的创新。因此,我们在进行IT架构及设备选型时,都要以“稳”和“快”来作为衡量标准。那么落到硬件平台的选择,我们又有哪些考量因素呢?首先是安全,作为银行应用的承载平台,安全是首选因素,在此,我们推荐LinuxONE作为银行双模IT新核心的计算平台。在安全性方面,LinuxONE具有业内服务器最高的EAL5+分区安全等级,确保分区间的安全隔离,另外,LinuxONE拥有独立的PCIe密码卡及SAP协处理器来根据用户需要进行加密。最后,LinuxONE有基于固件层的安全服务容器SSC,可以采用基于REST API的管理方式帮助有效防范来自内部及外部的各种潜在风险,确保数据安全 。性能方面,最新发布的LinuxONE Z14芯片是5.2Ghz,也是业内最高主频的芯片,四级缓存是以GB为单位的,这些跟性能相关的参数都是其他硬件平台所不能匹敌的,另外LinuxONE还独有专门的I/O协处理器和专门的power8芯片来负责I/O的处理,使得LinuxONE对于I/O复杂的系统更加有性能的优势,LinuxONE系统带宽高达832GB/S,对于同一台机器内的分区互联可采用Hypersocket的内存交换模式,不仅性能更高,也避免了外部网络可能存在的安全隐患。在扩展性方面,LinuxONE单机最大可支持85个Lpar,8000个虚机,2百万个容器,单一系统中单个MongoDB实例可扩展至17TB。在操作方面,LinuxONE支持一键式物理装机模式,有纯图形化的虚拟化管理工具WAVE,平台所支持的Linux发行版都是标准发行版,无需特别的技能。在数据处理方面,对于大数据平的支持,LinuxONE也有这一定的能力。这里需要特别提到的是生态系统,大家可以看下下面这张,从操作系统,到云管平台,再到开发语言,数据库、中间件,以及大数据应用,区块链应用,基本大家能见到在使用的版本,都在LinuxONE支持范围之内,这就造就了LinuxONE具有广泛适用性的生态系统。
5.金融企业面对互联网模式下的新核心架构建设,应该从那几个方面入手?
观点一(来自商业银行)应用架构方面:1.系统群保持原有总线架构,逐步将既有交易系统升级为耦合性低,扩展性及灵活性较强的应用架构。2.探索既有核心系统的的新模式:总账分离、业务细分、模块儿分布式组合。3.互联网金融业务产品开发面向服务式弹性开发模式发展。4.积极建设线上数据的分析挖掘平台,实现线上数据对业务的驱动。
基础架构方面:1.交易系统逐步打破传统资源利用模式:硬件资源和应用系统绑定模式拆分。2.外围平台存储架构转变为分布式存储架构,互联网金融平台根据数据特点引入对象存储架构。3.互联网基础平台直接跨越到微服务资源利用模式:操作系统和应用的绑定拆分。4.互联网区的网络架构由传统纵深式安全架构转变为扁平式软件定义网络架构。5.结合大数据技术和数据挖掘技术实现线上数据的采集和分析,实现对产品创新驱动。
观点二(来自商业银行)建设新核心主要分为以下几部分:1、构建DevOps工作流,涉及持续集成、持续交付、持续部署持续集成涉及代码管理gitlab、代码自动构建maven,代码扫描sonarcube,持续集成jenkins持续交付涉及单元测试,自动化测试工具持续部署涉及k8s搭建涉及以上模块的工具链,是建设新核心的基础,也是最重要的环节2、同时还涉及微服务改造,要把原本集成式的应用解耦,变成松耦合架构3、还涉及团队的建立(主要指构建扁平化团队)以及适应于新核心的流程管理体系
观点三(来自IBM)新建互联网新核心对于银行而言,不仅仅是新建一套系统那么简单,首先需要在业务层面进行梳理,明晰新老核心的边界,确定业务类型的划分,哪些业务是直接到互联网新核心的,新核心与老核心业务交互如何进行等,只有业务层面梳理清楚了,才能明确IT架构的设计。在IT架构设计层面,我们可以根据大平台小应用的建设理念,梳理哪些平台可以采用平台即服务的提供模式,建设统一的平台即服务架构,应用开发方面,我们可以采用基于容器的微服务模式来提升应用开发部署的灵活性和敏捷性。底层架构我们可以基于容器、K8S、DevOps等方式来实现。另外,还要运维团队能力的建设,是提升原有核心团队对于新架构的运维能力,还是新建一支团队来进行新核心的维护,这都是需要考虑的问题。
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!关注1745 文章
作者其他文章评论 1 · 赞 14评论 0 · 赞 3评论 2 · 赞 11评论 0 · 赞 6评论 0 · 赞 7相关文章评论 3 · 赞 15评论 1 · 赞 1评论 2 · 赞 5评论 0 · 赞 0评论 1 · 赞 4&
— talk with trend,talk with technologist
京ICP备号-30从CPU架构和技术的演变看GPU未来发展
日 00:01&&&出处:&& 作者:孙敏杰&&
GPU篇:动态分配式一级共享缓存
   GPU内部拥有很多种类型的缓存,不同的缓存都有各自特殊的用途,往往无法互相兼容,这完全不同与内部L1、L2、L3这样简单的层级关系。
★ Cypress的一级缓存:固定功能、固定容量的专用缓存
   的Cypress核心内部的流是按照SIMD(单指令多数据流)划分的,每组SIMD阵列内部包括了80个流,这些流处理器拥有独立的纹理单元和一级缓存(L1)以及本地数据共享缓存(Local Data Share)。
   为了满足DX11中DirectCompute 11的要求,增加了本地数据共享缓存的大小(Local Data Share,LDS),容量达到了32KB,是RV770的两倍。LDS用于同一个线程组(Thread Group)中的线程共享数据。从上图中我们可以看到,每一个SIMD连接一个LDS,不同的SIMD是不能共享LDS的,因此所有属于同一个线程组的线程都会被线程调度器发送到同一个SIMD上执行。
   如果不同的SIMD上的线程要共享数据,需要用到全局数据共享缓存(Global Data Share,GDS)。在Cypress中,GDS的容量也倍增了,达到64KB。到目前为止,我们对GDS的了解仍然有限,与LDS不同,并没有指令能显式的操作GDS。据Beyond3D的消息,在未来的OpenCL扩展中可能会提供对GDS的访问,目前GDS只对编译器可见。
★ GF100的一级缓存:可动态分配容量的多功能智能缓存
   以往的GPU都是没有一级缓存的,只有一级纹理缓存,因为这些缓存无法在通用计算中用于存储计算数据,只能用于在纹理采样时暂存纹理。而在GF100当中,NVIDIA首次引入真正的一级高速缓存,而且还可被动态的划分为共享缓存。
   在GF100 GPU中,每个SM除了拥有专用的纹理缓存外,还拥有64KB容量的片上缓存,这部分缓存可配置为16KB的一级缓存+48KB共享缓存,或者是48KB一级缓存+16KB共享缓存。这种划分方式完全是动态执行的,一个时钟周期之后可自动根据任务需要即时切换而不需要程序主动干预。
   一级缓存与共享缓存是互补的,共享缓存能够为明确界定存取数据的算法提升存取速度,而一级缓存则能够为一些不规则的算法提升存储器存取速度。在这些不规则算法中,事先并不知道数据地址。
  对于图形渲染来说,重复或者固定的数据比较多,因此一般是划分48KB为共享缓存,当然剩下的16KB一级缓存也不是完全没用,它可以充当寄存器溢出的缓冲区,让寄存器能够实现不俗的性能提升。
   而在并行计算之中,一级缓存与共享缓存同样重要,它们可以让同一个线程块中的线程能够互相协作,从而促进了片上数据广泛的重复利用并减少了片外的通信量。共享存储器是使许多高性能CUDA应用程序成为可能的重要促成因素。
★ 可动态分配的共享式一级缓存大幅提升并行计算效率
   再来算算一级缓存的总容量,Cypress拥有8KBx20=160KB的一级缓存,和32KBx20=640KB的本地数据共享缓存,还有额外的64KB全局数据共享缓存。
   而GF100拥有64KBx16=1MB容量的一级缓存+共享缓存,他们可以被动态的划分为256KB一级缓存+768KB共享缓存,或者768KB一级缓存+256KB共享缓存,另外还有12KBx16=192KB的纹理缓存,无论从哪个方面来比较,都要比Cypress强很多。
   此次NVIDIA创新性的可动态划分一级缓存设计,是以往CPU上面都不曾有过的先进技术,大幅提升了GPU并行计算的数据处理能力,使得GPU庞大的流处理器资源在高负荷密集型运算时不至于出现瓶颈,从而发挥出恐怖的浮点运算能力。
提示:试试“← →”可以实现快速翻页
扯扯车精品文章推荐

我要回帖

更多关于 dnf加命中率的称号 的文章

 

随机推荐