将 cuda 纹理变量作为参数传递
Pass cuda texture variable as an argument
我已设置 cudaArray
,并将其绑定到纹理:
texture<float, 2, cudaReadModeElementType> tex;
cudaChannelFormatDesc channelDesc =
cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat);
cudaArray *cuArray;
checkCudaErrors(cudaMallocArray(&cuArray,
&channelDesc,
width,
height));
checkCudaErrors(cudaMemcpyToArray(cuArray,
0,
0,
hData,
size,
cudaMemcpyHostToDevice));
现在我想知道,如果cuArray
和tex
里面的内容在计算过程中一直保持不变,我可以通过tex
and/or cuArray
到另一个函数,这样我就不必每次都进行绑定?
像这样:
DoJobUsingTex(float* output, float* input, int size, texture tex)
{
\ do something here
}
CUDA 在发布 CUDA 5 和 Kepler 硬件时引入了纹理对象。这些是所谓的 "bindless" 纹理,可以按值传递给内核,因此每次您想 运行 不同纹理数据上的内核时都不需要重新绑定内存。
您可以详细了解它们的使用 here。
我已设置 cudaArray
,并将其绑定到纹理:
texture<float, 2, cudaReadModeElementType> tex;
cudaChannelFormatDesc channelDesc =
cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat);
cudaArray *cuArray;
checkCudaErrors(cudaMallocArray(&cuArray,
&channelDesc,
width,
height));
checkCudaErrors(cudaMemcpyToArray(cuArray,
0,
0,
hData,
size,
cudaMemcpyHostToDevice));
现在我想知道,如果cuArray
和tex
里面的内容在计算过程中一直保持不变,我可以通过tex
and/or cuArray
到另一个函数,这样我就不必每次都进行绑定?
像这样:
DoJobUsingTex(float* output, float* input, int size, texture tex)
{
\ do something here
}
CUDA 在发布 CUDA 5 和 Kepler 硬件时引入了纹理对象。这些是所谓的 "bindless" 纹理,可以按值传递给内核,因此每次您想 运行 不同纹理数据上的内核时都不需要重新绑定内存。
您可以详细了解它们的使用 here。