楼主: 大多数88
859 18

[量化金融] 使用多个GPU实现聚合风险分析的加速 [推广有奖]

11
大多数88 在职认证  发表于 2022-4-29 16:57:25
直接访问表是ELT的一种高度稀疏的表示形式,它以高内存使用率为代价提供了非常快的查找性能。例如,考虑一个包含2000000个事件的事件目录和一个包含20000个事件的ELT,其中获得了非零损失值。为了使用直接访问表表示ELT,将在内存中生成2000000个损失值的数组,其中20000个为非零损失值,其余1980000个事件为零损失值。因此,如果一个层有15个ELT,那么在内存中会生成15×2,000,000=30,000,000个事件丢失对。出于任何其他原因,在下面的表格中使用了compact-Solver。搜索操作需要在紧凑表示中查找eventloss对。Sequential和binarysearch分别需要O(n)和O(log(n))内存访问来定位事件丢失对。即使采用需要恒定内存访问次数的恒定时间空间效率哈希方案(例如,布谷鸟哈希[15]),也存在相当大的实现和运行时性能复杂性。这种开销在具有由全局和共享内存组成的复杂内存层次结构的GPU上会很高。要对100万个试验(每个试验包含1000个事件)进行聚合分析,对于覆盖15个ELT的层,有1000×10000000×15=1500000000000个事件,需要随机访问150亿个损失值。直接访问表虽然浪费内存空间,但允许最少的内存访问,因为ELT中的每次查找只需要每次搜索操作一次内存访问。考虑了15个ELT的两种数据结构实现。在第一个实现中,每个ELT都是一个独立的表,因此,在一个读取周期中,每个线程都独立地从ELT中查找其事件。

12
nandehutu2022 在职认证  发表于 2022-4-29 16:57:29
一个块中的所有线程访问相同的ELT。相比之下,在第二个实现中,15个ELT组合为一个表。因此,线程然后使用共享内存一次加载组合的ELTsat的整行。第二个实现的性能比第一个实现差得多,因为要让线程从组合的ELT集中加载,每个线程必须首先写入它需要的事件。这会导致额外的内存开销。在多核CPU平台上的基本实现中,算法所需的全部数据都在内存中处理。基本算法的GPU实现使用GPU的全局内存来存储所有需要的数据结构。GPU上的基本并行实现需要高内存事务,并导致GPU平台上的性能不佳。为了克服这一挑战,可以通过globalmemory使用共享内存。GPU上的实现建立在并行实现的基础上,并考虑了三个优化。首先是分块,指处理固定大小(或分块大小)的事件块,以便有效使用sharedmemory。算法的四个步骤(基本算法中的第4-29行,即试验中的事件以及财务和层术语计算)被分块。此外,财务和层术语存储在流式多处理器的恒定内存中。在基本实现中,LX和LOX数据在全局内存中表示,因此,在应用财务和层配置的每一步中,必须访问和更新全局内存,从而增加相当大的开销。在优化的实现中,通过(a)分块财务和层术语计算,以及(b)分块memoryread操作(第4-7行),将该开销降至最低,以从Y ET读取事件,用Etid表示。

13
nandehutu2022 在职认证  发表于 2022-4-29 16:57:33
分块减少了全局内存更新和全局读取操作的数量。此外,数据跨越的好处也可以用来提高速度。其次是循环展开,这是指编译器复制for循环中包含的代码块,以减少forloop执行的迭代次数。第5行和第8行中提供的for循环使用pragma指令展开,从而减少了GPU需要执行的指令数。第三,将数据从shared和globalmemory迁移到内核注册表。与所有其他内存相比,内核注册表的延迟最小。优化的聚合风险分析算法也在多GPU平台上实现。该实现是通过在四个可用GPU之间分解聚合的analysisworkload来实现的。为此,CPU上的线程调用并管理GPU。CPU线程调用一种方法,该方法将内核所需的所有输入(三个输入在第二节中给出)和用于存储内核生成的输出的预分配数组作为输入。CPU线程以并行方式调用,从而有助于在多个GPU平台上实现速度提升。四、 性能分析在本节中,将考虑从顺序和并行实现中获得的结果。A.多核CPU的结果在顺序执行的实验中观察到,当试验中的事件数、试验数、每层平均ELT数和层数增加时,在使用单核的CPU上执行基本聚合分析算法的顺序版本的运行时间呈线性增加。

14
kedemingshi 在职认证  发表于 2022-4-29 16:57:36
对于一个典型的聚合分析问题,包含1000000个试验,每个试验包含1000个事件。顺序算法需要337.47秒,在直接访问表中查找损失集的时间超过65%,在数字(a)内核数量与执行时间(b)线程总数与执行时间(图1:聚合分析算法在多核CPU计算上并行实现的性能)方面,只有超过31%的时间。这表明,除了提高数值计算的速度外,降低查找时间的技术还可以在并行实现中提供显著的加速。图1展示了基本聚合分析算法在多核CPU上的性能。在图1a中,每个芯上都有一个单螺纹,芯的数量从1到8不等。每个线程对单个测试执行聚合分析,并通过在C++源代码中引入OpenMP指令来实现线程。观察到有限的加速。对于两个核心,我们实现了1.5倍的速度提升,对于四个核心,速度提升为2.2倍,对于8个核心,速度提升仅为2.6倍。随着内核数量的增加,我们并没有同样地增加内存的带宽,这是限制因素。该算法将大部分时间用于执行ELT数据结构的随机存取读取。由于这些访问不显示引用的局部性,因此它们不受处理器缓存层次结构的帮助。我们尝试了许多方法,包括GPU的分块方法,但未能成功地在我们的多核CPU上实现高加速。

15
能者818 在职认证  发表于 2022-4-29 16:57:40
然而,通过在每个内核上运行多个线程,绝对时间有了适度的缩短,如图2所示:绘制了线程数与在多个core GPU上执行并行实现所需时间的关系图。图1b展示了基本聚合分析引擎的性能,其中使用了所有8个内核,每个内核分配了许多线程。随着螺纹数量的增加,性能有所改善。由于每个内核有256个线程(总共2048个),总体运行时间从135秒降至125秒。除此之外,我们观察到收益递减,如图1a所示。B.由于GPU实现的许多核心GPU,CUDA提供了流式多处理器的抽象,称为CUDA块。在GPU上实现基本聚合分析算法时,我们需要选择每个CUDA块执行的线程数。例如,Consider100万个线程用于表示GPU上100万个测试的模拟,256个线程在流式多处理器上执行。将有100万人≈ 总共3906个锁,必须在14个流式多处理器上执行。因此,每个流式多处理器都必须执行≈ 279个街区。由于同一个流式多处理器上的线程共享共享和恒定内存的分配,因此需要进行区域权衡。如果我们的线程数量较少,每个线程可以拥有更多的共享和恒定内存,但如果线程数量较少,我们就没有机会隐藏访问全局内存的延迟。图2显示了当每个CUDA块的线程数在128到640之间变化时,在GPU上执行基本实现的并行版本所需的时间。每个区块至少需要128个线程才能充分使用可用硬件。

16
能者818 在职认证  发表于 2022-4-29 16:57:45
在每个块有256个线程的情况下,性能得到了改善,但超过这一点,性能的改善就会大大降低。GPU平台上聚合风险分析算法的优化实现旨在通过处理“块”(即固定大小的事件块,简称“块大小”)尽可能利用共享和恒定内存,以提高每个流式多处理器上存在的更快共享内存的利用率。为了进一步优化实现,循环被展开,通过将双变量更改为浮动变量来降低变量的精度,来自共享和全局内存的数据都被迁移到内核注册表。优化算法的运行时间从38.47秒显著减少到20.63秒,大约提高了1.9倍。C.来自多个GPU的结果图3说明了优化聚合分析算法在多个GPU上的性能。CPUthread用于选择一个可用的GPU来执行已分解的聚合分析问题。在实验中,使用一个、两个、三个和四个GPU执行聚合分析算法。在多个GPU上实现了比单个GPU更高的速度;在直接访问表中查找损失集所需的时间从20.1秒降至4.25秒,所有金融术语和层术语计算所需的时间从0.11秒降至0.02秒。在FourGPU上执行优化算法的最佳平均时间为4.35秒,比在多核GPU上执行优化算法的时间快约5倍,比在多个GPU机器的单个GPU上执行优化算法的时间快4倍(参见图3A)。

17
能者818 在职认证  发表于 2022-4-29 16:57:48
多个GPU的结果显示效率约为100%(见图3b)。图4显示了当每个块的线程数在16到64之间变化时,优化聚合分析算法在四个GPU上的性能。由于共享内存可以使用的块大小的限制,每个块不能超过64个线程。当每个块的线程数为32时,达到4.35秒的最佳性能;这是因为blocksize与GPU的扭曲大小相同,因此当发生高延迟操作时,可以交换整个线程块。由于共享内存溢出,增加每个块的线程数并不能提高性能。V.讨论图5和图6总结了从以下所有实验中获得的结果:(a)在CPU上的顺序实现,(b)在多核CPU上的并行实现,(c)在多核GPU上的并行实现,(d)在多核GPU上的优化并行实现,以及(e)在多核GPU上的优化并行实现。(a) 没有。

18
何人来此 在职认证  发表于 2022-4-29 16:57:51
GPU的数量与执行时间(b)在多个GPU上执行的效率图3:在多个GPU上优化并行执行聚合分析算法的性能图4:绘制四个GPU的每个块大小的线程数与在多个GPU上执行优化并行执行所用时间的关系图。图5显示了总体性能的下降执行1层骨料分析问题所需的时间,15损失集和1000000次试验,每次试验1000个灾难性事件,从CPU上顺序执行的337.47秒到图5中的4.35秒:绘制在硬件计算平台上执行顺序和并行执行的平均总时间条形图在四个GPU上优化并行执行。在多核CPU上并行实现需要123.5秒,大约是顺序实现所需时间的三分之一。这种加速是由于使用了CPU的多个核心,并且有内存模拟来实现任何进一步的加速。在多核CPU上,在多核GPU上执行并行实现所需的时间进一步减少了约三分之一至38.49秒。这种加速是通过GPU架构实现的,它为独立并行、快速内存访问和快速数值计算提供了大量的周期。在多核GPU上执行优化的并行实现所需的时间比多核GPU进一步减少了大约一半,达到20.63秒。在这种情况下实现的加速归功于以下四种形式的优化:(i)分块,(ii)循环展开,(iii)降低变量的精度,(iv)将数据迁移到内核注册表。

19
kedemingshi 在职认证  发表于 2022-4-29 16:57:55
在多个GPUTAKE上优化的并行实现时间为4.35秒,比CPU快约77倍;这种情况下的加速是由于优化和使用多个GPU实现的。图6显示了(a)从内存中获取事件,(b)在直接访问表中查找损失集,(c)财务术语计算,(d)层术语计算,以及(e)财务术语和层术语计算所花费的时间百分比。在CPU上的顺序实现中,从内存中获取事件的最佳时间超过10秒,在多核CPU上的并行实现中接近6秒,在多核GPU上的并行实现中接近4秒,在多核GPU上的优化实现中少于0.5秒,在多核GPU上少于0秒。1秒。在多个GPU上最优化的实现,其从内存中获取事件的时间比在CPU上的后续实现提高了100倍。执行聚合分析问题所需的大部分总时间用于在直接访问表中查找损失集。虽然顺序实现需要222.61秒进行查找,但在多个GPU上优化实现只需要4.25秒,这是改进的50倍。然而,仍有改进的余地来缩短时间。令人惊讶的是,在多个GPU上,97.54%的总时间(4.33秒)用于查找。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
扫码
拉您进交流群
GMT+8, 2026-1-24 14:44