2011-02-28 64 views
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); 

回答

1

INT ID = blockIdx.x + 256 * blockIdx.y;

该声明跨越了final_red的限制。

试试这个:

__global__ void texturekernel(int * final_red){ 

    int f = blockIdx.x * blockDim.x + threadIdx.x; 
    int c = blockIdx.y * blockDim.y + threadIdx.y; 

    int id =c/2 * 256 + f/2; 

    final_red[id] = tex2D(refTexture,c+0.5f,f+0.5f); 

    } 
+0

感谢Jawad.I试过了,我想问题不在于最终的数组,但与呼叫tex2d事情。只是为了检查我试图做float xx = tex2D(reftexture,f,c),它给了我一些垃圾值。我正确地将值绑定到数组,然后为什么会发生这种情况?任何线索? – Manish 2011-02-28 07:11:53

+0

你可以公开完整的代码,特别是纹理内存的绑定。 – jwdmsd 2011-02-28 07:27:01

+1

尝试使用简单内存而不是数组,并使用cudaBindTexture2D进行绑定,这将帮助您更好地进行可视化。我将通读代码并尝试找出问题所在。 – jwdmsd 2011-02-28 08:56:30