下面是一个名为job()
的简单函数,它在GPU中执行多个CuPy任务
我如何指示CuPy同时运行job()
一百万次,然后再汇总结果
我的问题的目的是了解如何通过CuPy向一个GPU提交多个并发作业
测试脚本
import numpy as np
import cupy as cp
def job( nsamples ):
# Do some CuPy tasks in GPU
d_a = cp.random.randn( nsamples )
d_b = cp.random.randint( -3, high=3, size=nsamples )
d_result = ( d_a + d_b )
d_hist, _ = cp.histogram( d_result, bins=cp.array([-3,-2,-1,0,1,2,3,4]) )
std = cp.std( d_hist )
return std
# Perform 1 job in GPU
nsamples = 10 #can be as large as tens to hundreds of thousands
std = job( nsamples, 0 )
print( 'std', std, type(std) )
更新:
# Create Cuda streams
d_streams = []
for i in range(0, 10):
d_streams.append( cp.cuda.stream.Stream( non_blocking=True ) )
# Perform Concurrent jobs via Cuda Stream.
results = []
for stream in d_streams:
with stream:
results.append( job( nsamples ) )
print( 'results', results, len(results), type(std) )
在阅读了这个{a1}、这个关于{a2}的丘比问题和这个关于{a3}的SOF问题之后,我尝试了上面的方法,这似乎是有效的。但是,我不知道如何查看作业是并发运行还是串行运行
问题:
我如何分析Cupy在GPU中执行作业的情况,以评估我的脚本是否在做我想做的事情?答案:nvprof --print-gpu-trace python filename.py
我可以发布的流的数量是否有限制(例如,受某些硬件限制)或是“无限”
一般来说,我的建议是将所有数据连接在一起(跨作业),并以数据并行的方式完成工作。下面是一个粗略的例子:
对于
job
中的大多数操作,我们可以执行适当的cupy
操作来处理所有作业的工作。举一个例子,std
函数可以很容易地扩展以在所有作业中执行其工作histogram
是个例外,因为numpy或cupy中的例程不允许使用分区/分段算法,我可以看到。所以我用了一个循环。如果这是您想要做的实际工作,那么可以编写一个分区直方图cupy例程作为cupy kernel。另一种选择是在streams中发布cupy直方图相关问题 更多 >
编程相关推荐