cuda - GPU中的上下文切换机制是什么?

标签 cuda opencl gpu gpgpu

据我所知,GPU在扭曲之间切换以隐藏内存延迟。但是我不知道在哪种情况下翘曲会被消除?例如,如果扭曲执行加载,并且数据已经在缓存中了。那么翘曲被切断还是继续下一个计算?如果有两个连续的加法会怎样?
谢谢

最佳答案

首先,一旦线程块在多处理器(SM)上启动,它的所有扭曲都将驻留,直到它们全部退出内核为止。因此,只有在有足够的寄存器用于该块的所有扭曲时,并且直到有足够的空闲共享内存用于该块,该块才会启动。

因此,翘曲永远不会被“切换出去”-在传统意义上没有翘曲间上下文切换,上下文切换需要将寄存器保存到内存并恢复它们。

但是,SM确实会从所有常驻经纱中选择发布指令。实际上,无论它们是什么类型的指令,无论有多少ILP(指令级并行性),SM都更可能连续发出来自不同翘曲的两条指令,而不是发出来自同一翘曲的两条指令。不这样做会使SM暴露于依赖项停顿。甚至“快速”指令(如加法)也具有非零延迟,因为算术管线长多个周期。例如,在Fermi上,硬件每个周期(峰值)可以发出2条或更多条翘曲指令,并且算术流水线等待时间约为12个周期。因此,您需要运行多个扭曲来隐藏算术延迟,而不仅仅是内存延迟。

通常,翘曲调度的详细信息取决于体系结构,没有公开记录,并且可以保证随时随地更改。 CUDA编程模型独立于调度算法,因此您不应在软件中依赖它。

关于cuda - GPU中的上下文切换机制是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6605581/

相关文章:

c++ - cl::Image3D 在 nVidia TITAN black 上出现段错误,但在 Intel openCL 设备上没有?

cuda - RTX 2080 Ti cuda-memcheck 在创建 Cublas 上下文开始时遇到错误

c++ - 在 cuda 内核中声明 CPP 对象

macos - MAC 上的 CUDA 工具包错误 : unable to open output file 'vectorAdd.o' :, 权限被拒绝

algorithm - 矩阵逆使用线性系统求解器通过 cublas、cublasCreate 异常或其他

parallel-processing - 在GPU上运行OS内核级计算是否有意义?

python - PyTorch 嵌入层引发 "expected...cuda...but got...cpu"错误

Cuda 重用事件来确定多个部分的执行时间

c++ - 使用 clEnqueueWriteBuffer 的内存损坏 - OpenCL

c - OpenCL 内核中的中断和继续