写一段cuda100使用cudaBindTexture2D 的示例代码
下面是一个使用cudaBindTexture2D的示例代码:
#include <cuda_runtime.h>
#include <stdio.h>
texture<float, cudaTextureType2D> tex;
__global__ void kernel(float *out, int width, int height)
{
int x = blockIdx.x * blockDim.x + threadIdx.x;
int y = blockIdx.y * blockDim.y + threadIdx.y;
if (x < width && y < height) {
out[y * width + x] = tex2D(tex, x, y);
}
}
int main()
{
int width = 512;
int height = 512;
float *data = new float[width * height];
for (int i = 0; i < width * height; i++) {
data[i] = i;
}
cudaArray *cuArray;
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<float>();
cudaMallocArray(&cuArray, &channelDesc, width, height);
cudaMemcpyToArray(cuArray, 0, 0, data, width * height * sizeof(float), cudaMemcpyHostToDevice);
cudaBindTextureToArray(tex, cuArray, channelDesc);
int block_size = 16;
dim3 dimBlock(block_size, block_size);
dim3 dimGrid((width + block_size - 1) / block_size, (height + block_size - 1) / block_size);
float *out;
cudaMalloc(&out, width * height * sizeof(float));
kernel<<<dimGrid, dimBlock>>>(out, width, height);
cudaUnbindTexture(tex);
cudaFreeArray(cuArray);
cudaFree(out);
delete[] data;
return 0;
}
在这个示例中,我们首先创建了一个大小为512 x 512的float数组,然后将其拷贝到了一个cudaArray中。接着,我们使用cudaBindTextureToArray将这个cudaArray绑定到了一个cuda纹理tex上。最后,我们使用kernel函数将tex中的数据读取到了一个大小为512 x 512的float数组中,并将其输出。最后,我们使用cudaUnbindTexture解绑了纹理,并释放了所有分配的内存
原文地址: http://www.cveoy.top/t/topic/fHNs 著作权归作者所有。请勿转载和采集!