rt,CPU调度和GPU上kernel函数的执行是异步的,那可不可以让GPU上同时运行两个kernel函数?
或者两个线程分别调用一个kernel函数,让他们并发地在GPU上运行?
可能是CUDA编程的基本常识吧……但找不到人交流,也查不到资料。
以及:如果不能并发执行的话,那先后两次kernel调用,之间是否需要同步一下?
看GPU高性能计算之CUDA的第75页例子,有此疑问。
谢谢大家~
应该有任务并行和数据并行两种方式,数据并行很常用。LZ说的应该是任务并行,应该是可以的,OpenCL是支持的,CUDA应该也支持。
你这种情况和我当初学cuda的时候一样,呵呵!不过现在资料已经很多了。
fermi支持单gpu上多kernel并行执行,但是也有很多限制。
谢谢codeboycjy和风辰的帮助。
刚刚查到编程指南3.2.6.3 Concurrent Kernel Execution对此有明确的说明。
另外查到一份PPT《Fermi架构CUDA编程与优化》第62页也有提到:Fermi架构支持同时执行多个kernel(最多16个),并且kernel间切换时间大大降低。因此一组流内的不同kernel可以充分占用GPU的执行单元。在每个grid中的block数量较少时,可以更好的利用GPU资源。
再次谢谢大家~
引用3楼:“因此一组流内的不同kernel可以充分占用GPU的执行单元。”
应该是多组流内的kernel可以充分利用GPU的执行单元。因为一组流内的总是会一个一个的执行的。
比如:
最常见的情况,启动kernel的时候没有指定流(即默认在stream0中),那么你多个kernel调用,是一个执行完再下一个的。
[
可以在GPU上同时运行两个。我的460卡,可以开多个stream,然后一个里面一个kernel调用。或者,你的两个host threads, 每个建立一个context, 然后再每个context里面正常执行,这样他们是并行的。并行可以稍微提高点速度。特别是对于小kernel来说。例如这个:
[ concurrentKernels ]
Using CUDA device [0]: GeForce GTX 460
Detected Compute SM 2.1 hardware with 7 multi-processors
Expected time for serial execution of 8 kernels = 0.080s
Expected time for concurrent execution of 8 kernels = 0.010s
Measured time for sample = 0.006s
使用8个流,来并行8个kernels, 运行时间从0.080s->0.006秒了(理论值0.080/8=0.010s)
这个例子是cuda自带的。
对的
超线性了,但是这个要求那些kernel是独立的,没有依赖
[
可以用Event和cu(da)StreamWaitEvent来处理多个流里面的kernel有的依赖。