tiny-gpu 学习 日志
【代码】tiny-gpu 学习 日志。
·
gpu.sv
memory-controller.sv
dcr.sv
dispatch.sv
core.sv
scheduler.sv
fetcher.sv
decoder.sv
core-thread.sv
alu.sv
pc.sv
lsu.sv
registers.sv
Dispatcher 将 N 个线程根据可用资源和调度策略划分成 M 个 block。
然后,Dispatcher 会依次将这些 blocks 分发给 I 个 core,每个 core 首先处理一个 block。
当一个 core 完成它当前的 block 后,它会从 Dispatcher 获取下一个 block,直到所有 block 都被处理完。
这种方式确保了每个 core 的计算资源被有效利用,且线程间的调度是有序的。
thread 个数 是 kernel 要执行的次数
某个特定的 kernel 是 一个特定的函数 , 它根据 thread 的id 来 做事情
一个 core 设计为能同时执行N(N>=1)个 thread 的并行架构
就看 core 有几套 (alu.sv pc.sv lsu.sv registers.sv) 了 , 注意, 有N套,不叫N thread(我们便于称呼,可以叫做 N thread-per-core) , 在gpu中, thead的个数 指的是 kernel 执行的次数
N 代表 一个core 可以同时执行 N 个 thread
gpu.sv
memory-controller.sv
dcr.sv
dispatch.sv
core.sv
scheduler.sv
fetcher.sv
decoder.sv
core-thread.sv
alu.sv
pc.sv
lsu.sv
registers.sv
cpu.sv
memory-controller.sv
core.sv
fetcher.sv
decoder.sv
alu.sv
pc.sv
lsu.sv
registers.sv
这是我对 gpu 和 cpu 的理解, 看起来 gpu 相对于cpu 来说, 多了 dcr 和 dispatch 和 scheduler
是的,您的理解基本正确。相比于传统的 CPU 结构,GPU 在设计上确实增加了一些特有的模块来处理并行计算任务。具体分析如下:
DCR (Device Control Register):这个模块通常用于管理 GPU 的执行状态,例如控制线程数等,它是 GPU 独特的设计,用于调度和控制多个并行执行单元的操作。CPU 通常不需要这种模块,因为它的设计更多是基于串行或少量并行任务。
Dispatcher:这是 GPU 中的重要模块,用于将线程块 (blocks) 分发到不同的计算核心 (compute cores) 上进行处理。GPU 需要通过 Dispatcher 来协调大量的线程并行执行。相比之下,CPU 的调度通常依赖于操作系统和处理器中的调度器。
Scheduler:GPU 中的每个核心都有自己的调度器,用于管理当前核心上执行的线程。调度器控制每个线程的执行顺序,确保资源的有效利用。CPU 也有调度器,但它主要是负责执行单线程或少量线程的调度。GPU 的调度器设计是为了高效地处理大量并行线程。
总结一下,GPU 的设计相比 CPU 多了 DCR、Dispatcher 和 Scheduler 等模块,这些模块的作用主要是优化大规模并行计算的执行和线程调度,而 CPU 主要处理更少量的线程和更复杂的指令调度。
一个core 内的 4套 core-thread 他们同一时刻执行的指令是一样的吗?
是的,在一个核心(core)内的多个 core-thread(例如 4 个 core-thread)通常会同时执行相同的指令集,这是因为 GPU 的并行计算是基于 SIMD(Single Instruction, Multiple Data)架构的。
具体原因分析:
SIMD(单指令多数据):GPU 通过这种架构同时在多个线程上执行相同的指令,但每个线程处理不同的数据。例如,在一个 core 内的 4 个 core-thread 会同时执行相同的加法指令,但每个线程处理的可能是不同的输入数据(例如矩阵运算中的不同元素)。
指令同步执行:虽然每个 core-thread 有自己的寄存器、ALU、LSU 等资源,但它们是按照相同的指令顺序同步执行的。即使每个 core-thread 处理的是不同的数据,它们执行的是相同类型的指令。
独立的线程数据:虽然指令相同,但每个 core-thread 处理的数据是独立的。这是 GPU 并行化的核心思想——每个线程执行相同的操作,但在不同的数据集上进行计算,从而加速运算过程。
举例说明:
假设有 4 个 core-thread 每个线程执行矩阵加法操作,虽然每个线程处理不同的矩阵元素(例如线程 1 处理 A[0,0] 和 B[0,0],线程 2 处理 A[0,1] 和 B[0,1],以此类推),但它们执行的操作是相同的:C[i,j] = A[i,j] + B[i,j]。
所以,同一时刻,4 个 core-thread 执行的指令是一样的,只是它们处理的数据不同。
gpu的发展 是要发展 单core 中的 thread-per-core 的数量还是 发展 core 的数量?
GPU的发展方向,是否应该发展单个核心中支持的 线程数(thread-per-core) 还是发展 核心数(core),取决于多个因素,包括硬件架构设计、并行计算的需求以及具体的应用场景。下面是对这两种方向的分析:
1. 发展单核心中的线程数(Thread-per-Core)
这种方向是增加每个核心能同时处理的线程数,这对于提升每个核心的并行能力非常重要。
优点:
资源利用率高:增加每个核心能同时处理的线程数意味着每个核心的计算资源(如 ALU、寄存器、LSU)能够更加充分地利用,特别是在某些计算任务中,数据吞吐量较大,或者计算密集型的工作负载时,增加线程数有助于提升并行度。
降低通信开销:当多个线程共享同一核心时,线程之间的通信和协调通常比跨多个核心之间的通信开销要小。
缺点:
可能导致资源竞争:当单个核心的线程数过多时,可能会发生内存访问、计算资源等方面的竞争,导致线程之间相互影响,降低性能。
功耗和热量问题:如果每个核心上运行的线程数过多,可能会导致单个核心的功耗增加,同时也可能带来热量问题,限制其进一步扩展。
2. 发展核心数量(Core Count)
增加 GPU 的核心数量是提升整体计算能力的直接方式。这意味着在同样的时间内,GPU 可以并行处理更多的计算任务。
优点:
极大地提升并行能力:更多的核心意味着可以同时处理更多的独立任务,这对于并行计算密集型的应用(如深度学习、图形渲染等)非常有效。
任务分配灵活:核心数量的增加使得分配给每个核心的工作量更加均匀,每个核心可以在独立的环境下工作,减少了线程间的依赖和同步问题。
可扩展性强:增加核心数是一种相对简单的扩展方式,可以通过硬件设计进一步扩展核心数量以满足更大的计算需求。
缺点:
增加硬件复杂性:更多的核心意味着更复杂的调度和资源管理,同时增加了芯片面积、功耗、散热等硬件上的挑战。
通信开销增加:更多核心之间需要频繁的通信和协调,尤其是在大型计算任务中,核心间的通信延迟和带宽问题可能影响整体性能。
3. 综合考虑:
实际上,单个核心的线程数和核心数量是相辅相成的,两者的发展应该根据目标应用的需求来平衡。
针对计算密集型任务(如科学计算、AI推理等),可能更侧重于增加核心数,因为通过更多的核心可以同时处理更多的独立任务。
针对内存密集型任务(如图像处理、深度学习训练等),则可能需要提升单个核心的线程数,以便在同一核心上能够高效利用资源进行大规模并行处理。
当前的 GPU 发展趋势:
目前,主流 GPU(如 NVIDIA 和 AMD)趋向于增加核心数量,而不是单纯地增加每个核心的线程数。这是因为大规模的并行计算往往要求在多个核心上分配多个线程,而不是将所有线程集中在少数几个核心上,以保证计算能力和资源的分配能够满足现代应用的需求(例如,深度学习、图形渲染等)。但在一些特殊应用中,也会针对特定任务优化单个核心的线程数。
总结:
多核心:适用于大规模并行计算,扩展 GPU 性能。
单核线程数:适用于资源密集型应用,提升单个核心的吞吐能力。
对于未来的 GPU 发展而言,可能是两者的平衡发展。
blockIdx: Index of the current thread block within the grid. 当前线程块在网格中的索引。
blockDim: Number of threads per thread block. 每个线程块中的线程数量。
threadIdx: Index of the current thread within its thread block. 当前线程在其所属线程块中的索引。
--- 访存步距的设计
针对每次 的 数据输入 和 输出
设计程序(程序要跑在 core 中每个 core-thread 中)
通过 blockIdx 和 blockDim(一般为 core 中 thread 的number) 和 threadIdx , 来计算 访存步距
更多推荐




所有评论(0)