常熟存储器和纹理存储器的使用

请问我在用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.x
blockDim.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快啊

在我为你回答完一个问题后,请坑一声!

而不是默不作声的继续询问下一个新问题,这会让解答者深为尴尬和感到被无视的。

以及,新问题请新发帖。谢谢。

好的,发个新帖