CUDA Текстурная память
Я новичок в CUDA, и у меня возникла проблема с задачей. Мне нужно вычислить интеграл методом центральных прямоугольников с использованием текстурной памяти, привязанной к линейной памяти. Я написала код, который вычисляет интеграл, но я не знаю, как использовать текстурную память (tex1Dfetch). Какую переменную я должна объявить как текстуру и где?
`
using namespace std;
texture<BASE_TYPE, 1, cudaReadModeElementType> texRef;
__global__ void integral_rect(BASE_TYPE* sum){
int idx = blockIdx.x * BLOCK_SIZE + threadIdx.x;
BASE_TYPE step_h = abs((x_high - x_low)) / n;
for(int i = idx; i < n; i += BLOCK_SIZE * GRID_SIZE){
// BASE_TYPE step_h = tex1Dfetch(texRef, i);
BASE_TYPE x = x_low + step_h * i;
sum[idx] += fx(x) * step_h;
}
}
int main() {
dim3 dimGrid(GRID_SIZE, 1, 1);
dim3 dimBlock(BLOCK_SIZE, 1, 1);
size_t size_sum = sizeof(BASE_TYPE) * BLOCK_SIZE * GRID_SIZE;
BASE_TYPE sum = 0.0;
BASE_TYPE* sum_h = (BASE_TYPE*) malloc(size_sum);
// привязка к линейной памяти
BASE_TYPE* sum_dev;
cudaMalloc((void **) &sum_dev, size_sum);
cudaMemcpy(sum_dev, sum_h, size_sum, cudaMemcpyHostToDevice);
cudaBindTexture(0, texRef, sum_dev);
integral_rect<<<dimGrid, dimBlock>>>(sum_dev);
// заставляет программу ждать завершения всех ранее выданных
// команд во всех потоках на устройстве, прежде чем продолжить
cudaDeviceSynchronize();
// копируем с девайса на хост
cudaMemcpy(sum_h, sum_dev, size_sum, cudaMemcpyDeviceToHost);
for(int i = 0; i < GRID_SIZE * BLOCK_SIZE; i ++){
sum += sum_h[i];
}
cout << "Определенный интеграл (центр прям): " << sum << endl;
double log_check = log(2);
cout << log_check;
cout << "\nПогрешность ЦП = " << abs(log(2) - sum) << endl;
free(sum_h);
cudaFree(sum_dev);
return 0;
}
`
Шаг вычисляется как: BASE_TYPE step_dev = abs((x_high - x_low)) / n;