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();
}