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;


Ответы (0 шт):