Concurrency 并发矩阵求和-过去的试卷
我目前正在大学三年级学习——我的计算机系统和并发性考试,我对过去的一个纸上问题感到困惑。没有人——甚至是讲师——回答了我的问题 问题:Concurrency 并发矩阵求和-过去的试卷,concurrency,parallel-processing,floating-point,gpu,computer-architecture,Concurrency,Parallel Processing,Floating Point,Gpu,Computer Architecture,我目前正在大学三年级学习——我的计算机系统和并发性考试,我对过去的一个纸上问题感到困惑。没有人——甚至是讲师——回答了我的问题 问题: 考虑以下GPU,它由8个时钟频率为1.5 GHz的多处理器组成,每个处理器包含8个多线程单精度浮点单元和整数处理单元。它有一个内存系统,由8个1GHz图形DDR3DRAM分区组成,每个分区宽8字节,容量为256 MB。通过合理的假设(陈述它们)和简单的矩阵乘法算法,计算计算C=a*B所需的时间。A、 B和C是n*n矩阵,n由系统的内存量决定。 解决方案中给出的答
考虑以下GPU,它由8个时钟频率为1.5 GHz的多处理器组成,每个处理器包含8个多线程单精度浮点单元和整数处理单元。它有一个内存系统,由8个1GHz图形DDR3DRAM分区组成,每个分区宽8字节,容量为256 MB。通过合理的假设(陈述它们)和简单的矩阵乘法算法,计算计算C=a*B所需的时间。A、 B和C是n*n矩阵,n由系统的内存量决定。
解决方案中给出的答案:
> Assuming it has a single-precision FP multiply-add instruction,
Single-precision FP multiply-add performance =
\#MPs * #SP/MP * #FLOPs/instr/SP * #instr/clock * #clocks/sec =
8 * 8 * 2 * 1 * 1.5 G = 192 GFlops / second
Total DDR3RAM memory size = 8 * 256 MB = 2048 MB
The peak DDR3 bandwidth = #Partitions * #bytes/transfer * #transfers/clock * #clocks/sec = 8 * 8 * 2 * 1G = 128 GB/sec
>Modern computers have 32-bit single precision So, if we want 3 n*n SP matrices,
maximum n is
3n^2 * 4 <= 2048 * 1024 * 1024
>nmax = 13377 = n
>The number of operations that a naive mm algorithm (triply nested loop) needs is calculated as follows:
>For each element of the
result, we need n multiply-adds For each row of the result,
>we need n * n multiply-adds For the entire result matrix, we need n * n * n multiply-adds Thus, approximately 2393 GFlops.
> Assuming no cache, we have loading of 2 matrices and storing of 1 to the graphics memory.
>That is 3 * n^2 = 512 GB of data. This process will take 512 / 128 = 4 seconds
Also, the processing will take 2393 / 192 = 12.46 seconds Thus the
entire matrix multiplication will take 16.46 seconds.
>假设它有一条单精度FP乘法加法指令,
单精度FP乘法加法性能=
\#MPs*#SP/MP*#触发器/指令/指令*#指令/时钟*#时钟/秒=
8*8*2*1*1.5克=192千兆次/秒
DDR3RAM内存总大小=8*256 MB=2048 MB
峰值DDR3带宽=#分区*#字节/传输*#传输/时钟*#时钟/秒=8*8*2*1G=128 GB/秒
>现代计算机有32位单精度,所以如果我们想要3个n*n SP矩阵,
最大n为
3n^2*4 nmax=13377=n
>朴素mm算法(三重嵌套循环)需要的操作数计算如下:
>对于
结果,我们需要对结果的每一行进行n次乘法相加,
>我们需要对整个结果矩阵进行n*n乘法相加,我们需要n*n*n乘法相加,因此,大约2393gflops。
>假设没有缓存,我们将加载2个矩阵,并将1个矩阵存储到图形内存中。
>即3*n^2=512 GB的数据。此过程将花费512/128=4秒
此外,处理将花费2393/192=12.46秒,因此
整个矩阵乘法需要16.46秒。
现在我的问题是-如何计算3*((13377)^2)=536832387
转换为536832387=512 GB
这是5.368亿个值。每个值的长度为4字节。内存接口的宽度为8字节(假设GPU无法获取2个值并将其拆分),这实际上使读写大小增加了一倍。因此,所使用的2GB内存被有效地读/写了两次(因为读了8个字节,忽略了4个字节),因此在RAM和GPU之间只传递4GB的数据
有人能告诉我哪里出了问题,因为我能想到的唯一方法是,5.368亿个结果是内存操作的值,单位为KB,这在任何地方都没有说明。看起来开发答案的人将512 Mi 4字节值与512 GiB混淆了。这个问题没有得到很好的解决,因为一个最简单的(分配每个C[i][j]但不阻塞或转置B的寄存器)矩阵在没有缓存的情况下相乘会读取a和B的每个元素n次。此外,虽然A可以作为连续流读取(利用GPU的SIMD特性),但B在每次内存访问中只能读取一个元素;由于GDDR3的突发长度为4,因此为B传输的32B中只有4B会被使用(带宽的巨大浪费)。没有内存访问和计算时间重叠似乎也是一个奇怪的假设。(总的来说,提供的解决方案看起来非常草率。)