用户
 找回密码
 立即注册
zhuzhenwu 该用户已被删除
发表于 2013-7-24 17:36:21
72015
请问      我在做对图像的归一化的处理,要求图像数据的格式必须是float型,其中要用到求出像素值的最大值Max最小值Min即他们之间的差Max-Min,我先编写了一个kernel函数,求出每个块的最大最小值,又编写了一个kernel函数做扫尾工作求出总的最大最小值,然后有编写了一个kernel函数来对图像进行归一化处理,现在已经得到最后的正确结果,现在的问题是能不能将这三个kernel函数合并成一个kernel函数,因为数据时float型无法用原子函数,我的想法是能不能将第二个做扫尾工作的kernel函数设定为device类型在kernel函数中调用,这样就能将三个kernel函数合并成一个kernel函数了,请问device类型的函数与扫尾的那个(也就是第二个kernel函数)相比较性能会不会很差。
    如果这样做行不通,版主对将这三个kernel合并有好的意见吗
__global__ void Maxkernel(float*dev_Img,int width,int height,float*dev_Max,float*dev_Min)
dev_Img是输入的图像数据,float*dev_Max,float*dev_Min是每一个block的最大最小值
__global__ void MaxMinkernel(float*dev_Max,float*dev_Min,int size,float*dev_C_Max,float*dev_C_Min)
float*dev_Max,float*dev_Min是每一个block的最大最小值,float*dev_C_Max,float*dev_C_Min是最后的图像的最大最小值
__global__ void normlize(float*dev_Img,int width,int height,float*dev_C_Max,float*dev_C_Min,float*Norm_Img)
dev_Img是输入的图像数据,规范化结果float*Norm_Img
使用道具 举报 回复
发表于 2013-7-25 14:09:19
LZ您好:

希望您能适当理解CUDA的基本概念以后,再考虑您的实现。

以及,此帖虽然已经移到水区,还是大致答复一下:

1:“能否合并为一个kernel”——一般不行,因为你中间步骤需要全局性的结果。

2:没有合适的atomic函数,您可以选择其他实现方案。

3:不能按照您设想的那样改成__device__函数,__device__函数是单个线程执行的,一般不能轻易把一个线程阵列执行的kernel变成一个线程执行的__device__函数。以及,您原来第二个kernel是需要您第一个kernel结束以后的全局结果的,请您理解这里的逻辑关系。

4:不能改为__device__函数,自然无法比较性能。

5:连续发射kernel本身效率并不低。以及请您直接考虑这个逻辑清晰的实现方法。

大致如此,祝您编码顺利~
使用道具 举报 回复 支持 反对
发表于 2013-7-26 17:05:21
ice 发表于 2013-7-25 14:09
LZ您好:

希望您能适当理解CUDA的基本概念以后,再考虑您的实现。

谢谢版主的回答,
                 问这问题前,__device__函数没用过,没理解__device__类型函数的用法。
使用道具 举报 回复 支持 反对
发表于 2013-7-26 17:32:25
ice 发表于 2013-7-25 14:09
LZ您好:

希望您能适当理解CUDA的基本概念以后,再考虑您的实现。

版主
         我想问一下什么样的帖子会被移到灌水区啊
使用道具 举报 回复 支持 反对
发表于 2013-7-26 18:25:46
zhuzhenwu 发表于 2013-7-26 17:32
版主
         我想问一下什么样的帖子会被移到灌水区啊

您好:

没有适当的讨论内容的帖子都将被移动到水区。

包括但不限于:无法将问题叙述清楚的,没有CUDA基本概念的,讨论不相关内容的,上来直接要代码的,以及不听版主劝阻的等。
使用道具 举报 回复 支持 反对
发表于 2013-7-26 19:43:57
ice 发表于 2013-7-26 18:25
您好:

没有适当的讨论内容的帖子都将被移动到水区。

谢谢版主,明白了
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册