当我有表面声明时,如何为sm_1X和sm_2X编译CUDA程序

时间:2012-04-15 10:56:43

标签: c++ cuda macros c-preprocessor nvcc

我正在编写一个使用曲面(重新采样并写入纹理)以获得性能增益的库:

...
surface<void,  2> my_surf2D; //allows writing to a texture
...

目标平台GPU具有计算能力2.0,我可以用以下代码编译我的代码:

nvcc -arch=sm_20 ...

它运作得很好。

问题在于我正在尝试在我的笔记本电脑上开发和调试库,该笔记本电脑具有计算能力为1.1的NVIDIA ION GPU(我也希望我的库能够向后兼容)。我知道这种架构不支持表面,所以我在设备代码中使用了nvcc宏来为这个旧架构定义一个备用代码路径:

#if (__CUDA_ARCH__ < 200)
#warning using kernel for CUDA ARCH < 2.0
...
temp_array[...] =  tex3D(my_tex,X,Y,Z+0.5f);
#else
...
surf2Dwrite( tex3D(my_tex,X,Y,Z+0.5f), my_surf2D, ix*4, iy,cudaBoundaryModeTrap);
#endif

问题是,当我这样做时:

nvcc -gencode arch=compute_11,code=sm_11

我收到此错误:

ptxas PTX/myLibrary.ptx, line 1784; fatal  : Parsing error near '.surf': syntax error

当我查看PTX文件时,看到的是表面声明:

.surf .u32 _ZN16LIB_15my_surf2DE;

如果我尝试在源代码中的表面声明周围放置一个类似的宏:

#ifdef __CUDACC__
#if __CUDA_ARCH__ < 200
#warning skipping surface declaration for nvcc trajectory
#else
surface ...
#endif
#else
#warning keeping surface declaration by default
surface ...
#endif

我得到一个错误,表示在主机代码调用中未定义表面变量以将cuda曲面绑定到数组。我是否在绑定函数周围添加宏?

我不确定是否可能,或者如果我在某个地方蠢蠢欲动,请帮忙。

1 个答案:

答案 0 :(得分:3)

想想这个帖子应该显示为已回答......

我让它工作(实际上非​​常简单)。您必须在使用表面引用的所有三个可能位置放置一个宏,并小心使用宏(事实证明,不需要__CUDACC__)。

以下仅在编译计算能力时更改代码&lt; 2.0

表面声明:

//enable backwards compatability:
#if defined(__CUDA_ARCH__) & (__CUDA_ARCH__ < 200)
#warning skipping surface declarations for compute capability < 2.0
#else
surface<void,  2> my_surf2D; //allows writing to a texture
#endif

表面装订:

#if defined(__CUDA_ARCH__) & (__CUDA_ARCH__ < 200)
#warning skipping cudaBindSurfaceToArray for compute capability < 2.0
...
#else
errorCode = cudaBindSurfaceToArray(my_surf2D, my_cudaArray2D);
#endif

表面写作:

#if defined(__CUDA_ARCH__) & (__CUDA_ARCH__ < 200)
#warning using kernel for compute capability < 2.0
...
temp_array[...] =  tex3D(my_tex,X,Y,Z+0.5f);
#else
...
surf2Dwrite( tex3D(my_tex,X,Y,Z+0.5f), my_surf2D, ix*4, iy,cudaBoundaryModeTrap);
#endif

这适用于虚拟和真实目标(分别是-arch = compute_XX和-arch = sm_XX)。

感谢talonmiesRoger Dahl指示我正确的方向,以及来自this answertalonmies,它对nvcc / CUDA宏也有很好的解释