请问
我要求一幅图像中的最大最小值,我的分块是这样的, dim3 DimBlock(16,16,1);dim3 DimGrid((width+DimBlock.x-1)/DimBlock.x,(height+DimBlock.y-1)/DimBlock.y,1);
是用归约算法先求出每一个block中的最大最小值,在比较各个block的最大最小值,可是block见识不能通信的,我该怎么做,对已经求出的每个block的最大最小值,在求出这些值中的最大最小值,最后只得到两个数,一个最大值一个最小值
这地方有点糊涂,求指点
将每个block 中的最大最小值传回host,然后再进行比较。
LZ您好:
这个功能是容易实现的。
我说两种方法:
1:您可以每个block将自己的结果保存在global memory里面,然后等这个计算的kernel结束,就可以得到每个block的结果,此时再启动一个辅助的小型kernel进行扫尾工作,求出最终需要的结果即可。
2:因为您这里需要的最终的扫尾工作比较简单,所以也可以在原计算kernel中直接实现。您可以在每个block求得自己的结果以后,使用atomicMin()和atomicMax()这两个原子操作的函数,将本block的结果与global memory中的全局结果进行比较和替换。
因为是atomic操作,所以是安全的,以及,每个block进行一次原子操作,这个执行代价也完全可以接受。
需要注意的两点细节:
a:需要对保存全局结果的变量适当进行初始化,以免出现问题。
b:每个block得到规约结果以后,指定一个线程去进行atomic操作。否则,多个线程都去进行原子操作,将极大地影响效率。
大致如此,供您参考。
祝您编码顺利~
您好:
您这个方法也是可行的方法。对于后续数据需要host端使用的话,没有什么大碍;而后续数据如果在device端使用,那么由CPU处理完以后,还需要再次传回,这样将增加两次无辜的数据copy时间,就不如3#中建议的做法了。
欢迎您积极参与讨论!
祝您好运!
谢谢版主的回答
第一种方法也就是说再编写一个kernel函数,来处理得到的每个块的最大最小值来得到最后的最大最小值,
是吗
LZ您好:
是的,第一种方法是您当前的那个kernel只管计算每个block的最大值和最小值,并保存起来。
然后再启动一个另外的kernel来讲前面保存的结果加以处理,找出全局最大值和最小值。
祝您编码顺利~
不客气的,欢迎您莅临CUDA ZONE @CHINA
祝您好运~