tex1Dfetch () не записывает изменение значений - PullRequest
0 голосов
/ 11 июля 2011

В приведенном ниже коде я сначала связываю текстуру ref с массивом gpu в глобальной памяти. Затем я вызываю функцию getVal, в которой сначала устанавливаю значение gpu [1] равным 5, а затем читаю его, используя связанную текстуру, используя tex1Dfetch(ref,1). Однако в этом случае tex1Dfetch () не отображает измененное значение gpu [5], вместо этого оно отображает старое значение.

Затем я вызываю другую функцию с именем 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();


}

1 Ответ

3 голосов
/ 11 июля 2011

В рамках одного и того же вызова ядра кэш текстуры не поддерживает согласованность с глобальной памятью. См. Раздел 3.2.10.4 Руководства по программированию CUDA 4.0 C. Связность кэша текстуры между последовательными вызовами ядра достигается драйвером, сбрасывающим кэш текстуры перед запуском ядра.

...