#include <cuda_runtime.h>
#include <iostream>
// 定义纹理引用
texture<float, 1, cudaReadModeElementType> texRef;
__global__ void linearInterpolation(float* output, const int width, float scale) {
int x = blockIdx.x * blockDim.x + threadIdx.x;
float texX = x * scale;
if (x < width) {
output[x] = tex1Dfetch(texRef, texX);
}
}
int main() {
const int width = 100;
float h_input[width];
float h_output[width];
// 初始化输入数据
for (int i = 0; i < width; i++) {
h_input[i] = i*i;
}
float* d_input;
float* d_output;
cudaMalloc(&d_input, width * sizeof(float));
cudaMalloc(&d_output, width * sizeof(float));
cudaMemcpy(d_input, h_input, width * sizeof(float), cudaMemcpyHostToDevice);
// 将纹理与输入数据绑定
cudaBindTexture(NULL, texRef, d_input, width * sizeof(float));
// 定义线程块和网格尺寸
int threadsPerBlock = 256;
int blocksPerGrid = (width + threadsPerBlock - 1) / threadsPerBlock;
// 运行核函数
float scale = 0.2f; // some scale factor for interpolation
linearInterpolation << <blocksPerGrid, threadsPerBlock >> > (d_output, width, scale);
cudaMemcpy(h_output, d_output, width * sizeof(float), cudaMemcpyDeviceToHost);
// 打印结果
for (int i = 0; i < width; i++) {
std::cout << h_output[i] << " ";
}
std::cout << std::endl;
cudaUnbindTexture(texRef);
cudaFree(d_input);
cudaFree(d_output);
return 0;
}
cuda:用纹理内存实现插值操作
最新推荐文章于 2024-05-23 23:33:01 发布