0
我需要对图像进行下采样。有些阅读暗示说如果我使用纹理存储器,那么这个函数是免费的,速度更快(我正在寻找双线性插值)。有人告诉我?正是为此编写内核这是我目前有: (我用的(1,1)的线程块)使用纹理存储器对图像进行下采样
__global__ void texturekernel(int * final_red){
int f = (blockIdx.x * blockDim.x) + threadIdx.x;
int c = (blockIdx.y * blockDim.y) + threadIdx.y;
int id=blockIdx.x+256*blockIdx.y;//256 is the width of downsampled image ..original was 512
final_red[id]=tex2D(refTexture,c+0.5f,f+0.5f);//This is just for the red channel
//where reftexture is defined as texture <float, 2, cudaReadModeElementType> refTexture;
};
此版本目前给我的全0输出。
编辑(在这个版本中我试图下采样2倍2000 * 512大小的图像分为2 1000 * 256):
texture <float, 2, cudaReadModeElementType> refTexture; // global variable !
cudaArray* myArray;
cudaChannelFormatDesc description = cudaCreateChannelDesc<float>();
cudaError rs=cudaMallocArray ( &myArray,&description, 512,2000*2);//
//This line below is part of loop where input image is read row by row ..rowchecker keeps track of the row
cudaMemcpyToArray(myArray,0,rowchecker++,array_temp_red,sizeof(int)*test_columns,cudaMemcpHostToDevice);
refTexture.normalized=false;
refTexture.addressMode[0]=cudaAddressModeClamp;
refTexture.addressMode[1]=cudaAddressModeClamp;
refTexture.filterMode=cudaFilterModePoint;
cudaBindTextureToArray(refTexture,myArray);
dim3 blockSize(1,1);
int n_blocks_x=256;
int n_blocks_y=1000*2;
dim3 gridSize(n_blocks_x,n_blocks_y);
cudaMalloc((void**)&finalarray,(2000)*(512)*2/4*sizeof(int));
texturekernel<<<gridSize,blockSize>>>(finalarray);
感谢Jawad.I试过了,我想问题不在于最终的数组,但与呼叫tex2d事情。只是为了检查我试图做float xx = tex2D(reftexture,f,c),它给了我一些垃圾值。我正确地将值绑定到数组,然后为什么会发生这种情况?任何线索? – Manish 2011-02-28 07:11:53
你可以公开完整的代码,特别是纹理内存的绑定。 – jwdmsd 2011-02-28 07:27:01
尝试使用简单内存而不是数组,并使用cudaBindTexture2D进行绑定,这将帮助您更好地进行可视化。我将通读代码并尝试找出问题所在。 – jwdmsd 2011-02-28 08:56:30