2011-07-10 33 views
0

在下面的代碼中,我首先將名爲ref的紋理綁定到全局內存中名爲gpu的數組。然後我調用一個名爲getVal的函數,其中我首先將gpu [1]的值設置爲5,然後使用綁定紋理使用tex1Dfetch(ref,1)讀取它。但是,在這種情況下,tex1Dfetch()不顯示gpu [5]的更改值,而是顯示舊值。tex1Dfetch()不記錄值的變化

然後,我調用另一個名爲getagain的函數,它只是再次讀取tex1Dfetch(ref,1)。但是,這次我獲得了新的價值。我真的不明白爲什麼在第一個函數中我沒有得到改變的值。

#include<cuda_runtime.h> 
#include<cuda.h> 
#include<stdio.h> 
texture<int> ref; 


__global__ void getVal(int *c, int *gpu){ 

    gpu[1] = 5; 

    *c = tex1Dfetch(ref, 1); // returns old value, not 5 


} 

__global__ void getagain(int *c){ 

    *c = tex1Dfetch(ref, 1); // returns new value !!!???? 

} 

void main(){ 
int *gpu,*c; 
int i,b[10]; 
for(i =0 ; i < 10; i++){ 

    b[i] = i*3; 

} 

cudaMalloc((void**)&gpu, sizeof(int) * 10); 
cudaBindTexture(NULL, ref, gpu,10*sizeof(int)); 
cudaMemcpy(gpu, b, 10 * sizeof(int), cudaMemcpyHostToDevice); 

cudaMalloc((void**)&c, sizeof(int)); 

//try changing value and reading using tex1dfetch 
getVal<<<1,1>>>(c,gpu); 
cudaMemcpy(&i, c,sizeof(int), cudaMemcpyDeviceToHost); 
printf("the value returned by tex fetch is %d\n" , i); 
cudaMemcpy(b, gpu,10*sizeof(int), cudaMemcpyDeviceToHost); 
for(i =0 ; i < 10; i++){ 
printf("%d\n",b[i]); 
} 
getagain<<<1,1>>>(c); 
cudaMemcpy(&i, c,sizeof(int), cudaMemcpyDeviceToHost); 
printf("the value returned by tex fetch is %d\n" , i); 

getchar(); 


} 

回答

3

在同一個內核調用,紋理緩存不維護與全局內存的一致性。請參見CUDA 4.0 C編程指南的第3.2.10.4節。紋理高速緩存的一致性之間連續的內核調用是由驅動程序在啓動內核之前刷新紋理高速緩存來實現的。