Cuda tex1Dfetch()不记录值的更改

Cuda tex1Dfetch()不记录值的更改,cuda,nvidia,Cuda,Nvidia,在下面的代码中,我首先将名为ref的纹理绑定到全局内存中名为gpu的数组。然后调用一个名为getVal的函数,在该函数中,我首先将gpu[1]的值设置为5,然后使用绑定纹理使用tex1Dfetch(ref,1)读取它。但是,在本例中,tex1Dfetch()不显示gpu[5]的更改值,而是显示旧值 然后,我调用另一个名为GetReach的函数,它只是再次读取tex1Dfetch(ref,1)。但是,这次我得到了新的值。我真的不明白为什么在第一个函数中我没有得到更改后的值 #include<

在下面的代码中,我首先将名为ref的纹理绑定到全局内存中名为gpu的数组。然后调用一个名为getVal的函数,在该函数中,我首先将gpu[1]的值设置为5,然后使用绑定纹理使用
tex1Dfetch(ref,1
)读取它。但是,在本例中,tex1Dfetch()不显示gpu[5]的更改值,而是显示旧值

然后,我调用另一个名为GetReach的函数,它只是再次读取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();


}
#包括
#包括
#包括
纹理参考;
__全局无效getVal(int*c,int*gpu){
gpu[1]=5;
*c=tex1Dfetch(ref,1);//返回旧值,而不是5
}
__全局无效再次获取(int*c){
*c=tex1Dfetch(ref,1);//返回新值!!!????
}
void main(){
int*gpu,*c;
int i,b[10];
对于(i=0;i<10;i++){
b[i]=i*3;
}
Cudamaloc((void**)和gpu,sizeof(int)*10;
cudaBindTexture(NULL,ref,gpu,10*sizeof(int));
cudaMemcpy(gpu,b,10*sizeof(int),cudamemcpyhostodevice);
Cudamaloc((void**)和c,sizeof(int));
//尝试使用tex1dfetch更改值和读取
getVal(c,gpu);
cudaMemcpy(i、c、sizeof(int)、cudaMemcpyDeviceToHost);
printf(“tex fetch返回的值是%d\n”,i);
cudaMemcpy(b,gpu,10*sizeof(int),cudaMemcpyDeviceToHost);
对于(i=0;i<10;i++){
printf(“%d\n”,b[i]);
}
再次(c);
cudaMemcpy(i、c、sizeof(int)、cudaMemcpyDeviceToHost);
printf(“tex fetch返回的值是%d\n”,i);
getchar();
}

在同一内核调用中,纹理缓存不会与全局内存保持一致。参见CUDA 4.0 C编程指南第3.2.10.4节。在启动内核之前,驱动程序刷新纹理缓存可实现连续内核调用之间的纹理缓存一致性。

在同一内核调用中,纹理缓存不会与全局内存保持一致性。参见CUDA 4.0 C编程指南第3.2.10.4节。连续内核调用之间的纹理缓存的一致性是通过驱动程序在启动内核之前刷新纹理缓存来实现的