请问我在用CUDA处理一幅三通道的RGB图像,处理时将每一个像素的B,G,R值分别加上一个常数,就是B+A[0],G+A[1],R+A[2]
这样可以将这个长度为3的数组放入常数存储器,接着用纹理存储器来处理这幅图像吗
LZ您好:
1:如果您要实现的问题如同您1#中说的这么简单的话,那么您的图像数据直接读取就可以了。
2:以及您的3个常数作为kernel参数就行了,在2.x及以上的硬件上,他们就在常数存储器中,而无需您手工在折腾了。
大致如上,祝您好运~
楼主您好,
您无需这么处理,除了__constant__这种用法,您还可以直接在您的代码里面使用这个常数:
例如:
uchar4 pixel = …;
pixel.x += 你的常数0;
pixel.y += 你的常数1;
pixel.z += 你的常数2;
这种用法,如果这3个常数可以被当作立即数嵌入到指令里,那么将会比使用__constant__更为便捷。
如果这3个常数编译器认为无法嵌入到指令里,作为立即数,则会自动为您防致为__constant__,无需您手工操心。
如果您不愿意自动放置,您还可以手工使用__constant__定义的,但我推荐你使用上文的自动放置。
关于您的第二个问题,是使用纹理(texture)和__constant__无关(也和你的需要无关),建议无视。
感谢深夜来访。
我回复完毕后发现ICE也回复了一个不错的主意,
这个非常灵活,依然也是在constant cache里的,同样无需您手工写__constant__,
而且这个当您的多次kernel启动需要不同的3个A0,A1,A2值的时候,非常不错。
您也可以考虑这个。
我的算法是做了个计算,程序如下:
global void SquaresKernel(const float Img, const float A,int width,int height,floatdest)
{
int x=threadIdx.x+blockIdx.xblockDim.x;
int y=threadIdx.y+blockIdx.y*blockDim.y;
int tid=y*width+x;//就是本线程处理的那个像素
if(x<width&&y<height)
{
dest[tid]=(float)((A[0]-Img[tid*3])*(A[0]-Img[tid*3])+
(A[1]-Img[tid*3+1])*(A[1]-Img[tid*3+1])+
(A[2]-Img[tid*3+2])*(A[2]-Img[tid*3+2]));
}
}
为什么这么做,还没有用C快啊
在我为你回答完一个问题后,请坑一声!
而不是默不作声的继续询问下一个新问题,这会让解答者深为尴尬和感到被无视的。
以及,新问题请新发帖。谢谢。
好的,发个新帖