【发布时间】:2017-11-21 11:34:03
【问题描述】:
我尝试使用__CUDA_ARCH__,但我在某处读到这仅适用于代码的设备部分。
之后,我在github上偶然发现了这段代码:link
有没有更好的方法来实现这一点?
我之所以问这个问题是因为我想(在主机代码上)确定 GPU 是否支持统一内存,在这种情况下会发生 cudaMallocManaged 或者 cudaMallocs && cudaMemcpys 会发生。
我想做的例子:
int main() {
// IF CUDA >= 6.0 && COMPUTE CAPABILITY >= 3.0
// USE cudaMallocManaged
// ELSE
// USE cudaMallocs && cudaMemcpys
// END IF
return 0;
}
【问题讨论】:
-
我认为SDK中有一个代码示例用于获取计算能力。
-
@PaulR 所以你建议我应该使用
__host__ cudaError_t cudaGetDeviceProperties ( cudaDeviceProp* prop, int device )并从managedMemSupported变量中读取值。如果我想用一些甚至没有cudaMallocManaged定义的旧 CUDA API 编译完全相同的代码怎么办? -
我不知道——我已经很久没有使用 CUDA 工作了——我只记得 SDK 中有一个代码示例报告了计算能力,仅此而已。
-
@PaulR 哦,好的!不管怎么说,还是要谢谢你! ;)
-
注意
cudaGetDeviceProperties()和__CUDA_ARCH__查询计算能力是有区别的:前者给出的是设备的实际计算能力,后者给出的是设备代码已经得到的计算能力编译为。如果不同的计算能力设备二进制兼容,或者 PTX 代码是否由驱动程序转换为实际架构,它们可能会有所不同。
标签: cuda visual-studio-2017 compile-time nvcc preprocessor-directive