Hi all,
I am trying to use texture memory on an easy example but I have some troubles.
Here is my code
#include <stdio.h>
#include <stdlib.h>
extern texture<float, cudaTextureType1D, cudaReadModeElementType> tex;
/** Kernel function **/
__global__ void KernelTest(float* tab1_D, float* tab2_D)
{
// Thread index
int idx = threadIdx.x;
// Global memory
tab2_D[idx] = tab1_D[idx];
// Reading texture memory
//tab_D[idx] = tex1Dfetch(tex, idx);
}
void test(){
/** Initialisation **/
int N = 128;
float* tab1_H;
float* tab1_D;
float* tab2_H;
float* tab2_D;
cudaError_t erreur;
tab1_H = (float*) malloc( N*sizeof(*(tab1_H)));
if( tab1_H == NULL ){
printf("ERREUR: Problème de malloc de tab_H\n");
exit(1);
}
tab2_H = (float*) malloc( N*sizeof(*(tab2_H)));
if( tab2_H == NULL ){
printf("ERREUR: Problème de malloc de tab_H\n");
exit(1);
}
erreur = cudaMalloc((void**)&(tab1_D), N*sizeof(*(tab1_D)));
if( erreur != cudaSuccess ){
printf("ERREUR: Problème de cudaMalloc de tab_D\n");
exit(1);
}
erreur = cudaMalloc((void**)&(tab2_D), N*sizeof(*tab2_D));
if( erreur != cudaSuccess ){
printf("ERREUR: Problème de cudaMalloc de tab_D\n");
exit(1);
}
for( int i=0; i<N; i++ )
tab1_H[i] = i;
/** Sending of the tab in the device **/
erreur = cudaMemcpy(tab1_D, tab1_H, N*sizeof(*(tab1_D)), cudaMemcpyHostToDevice);
if( erreur != cudaSuccess ){
printf( "ERREUR: Problème de copie tab_D\n");
printf( "Nature de l'erreur: %s\n",cudaGetErrorString(erreur) );
exit(1);
}
/** Initialisation of the texture memory **/
erreur = cudaBindTexture(NULL, tex, tab1_D, N*sizeof(float));
if( erreur != cudaSuccess ){
printf( "ERREUR: Problème de bindTexture dans test\n");
printf( "Nature de l'erreur: %s\n",cudaGetErrorString(erreur) );
exit(1);
}
dim3 blockSize(N,1);
KernelTest<<<1, blockSize>>>(tab1_D, tab2_D );
erreur = cudaMemcpy(tab2_H, tab2_D, N*sizeof(*(tab2_D)), cudaMemcpyDeviceToHost);
if( erreur != cudaSuccess ){
printf( "ERREUR: Problème de copie tab_D\n");
printf( "Nature de l'erreur: %s\n",cudaGetErrorString(erreur) );
exit(1);
}
/** Final result **/
for( int i=0; i<N; i++ ){
printf("tab1_H[%d] = %f\n",i,tab1_H[i]) ;
printf("tab2_H[%d] = %f\n",i,tab2_H[i]) ;
}
cudaUnbindTexture(tex);
cudaFree(tab1_D);
cudaFree(tab2_D);
free(tab1_H);
free(tab2_H);
}
int main(){
test();
}
As a result, I have all value of tab2_D egal to zero.
EDIT: I HAD. Magic??
Do you have any idea how to correct my code?
Thanks.