首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >tex1Dfetch()不记录值的更改

tex1Dfetch()不记录值的更改
EN

Stack Overflow用户
提问于 2011-07-10 20:39:43
回答 1查看 1.2K关注 0票数 0

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

然后,我调用另一个名为getagain的函数,它再次读取tex1Dfetch(ref,1)。然而,这一次我得到了新的价值。我真的不明白为什么在第一个函数中我没有得到改变的值。

代码语言:javascript
运行
复制
#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();


}
EN

回答 1

Stack Overflow用户

发布于 2011-07-11 01:11:32

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6643526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档