4 errors detected in the compilation of “render_utils_kernel.cu“

文章讲述了在Windows10平台上使用Python3.10.13和Torch1.12.1时,遇到在Cuda11.7环境中编译render_utils_kernel.cu文件时关于pow函数调用的错误,通过将pow函数从host到device的调用改为类型转换后解决了编译问题。
部署运行你感兴趣的模型镜像

部署环境:

平台:Windows 10

Python:3.10.13

Torch:1.12.1

Cuda:11.7

通过nvcc编译render_utils_kernel.cu的时候会返回以下错误信息

render_utils_kernel.cu(441): error: calling a __host__ function("std::conditional< ::std::is_same_v|| ::std::is_same_v, long double,    ::std::conditional< ::std::is_same_v&& ::std::is_same_v, float, double> ::type> ::type  ::pow<double, float, (int)0> (T1, T2)") from a __global__ function("raw2alpha_cuda_kernel<double> ") is not allowed

render_utils_kernel.cu(441): error: identifier "pow<double, float, (int)0> " is undefined in device code

render_utils_kernel.cu(515): error: calling a __host__ function("std::conditional< ::std::is_same_v|| ::std::is_same_v, long double,    ::std::conditional< ::std::is_same_v&& ::std::is_same_v, float, double> ::type> ::type  ::pow<double, float, (int)0> (T1, T2)") from a __global__ function("raw2alpha_backward_cuda_kernel<double> ") is not allowed

render_utils_kernel.cu(515): error: identifier "pow<double, float, (int)0> " is undefined in device code

4 errors detected in the compilation of "render_utils_kernel.cu".

 根据错误提示,修改render_utils_kernel.cu的441行和515行

# 原始代码
alpha[i_pt] = 1 - pow((1 + e), (-interval));


# 修改为
alpha[i_pt] = 1 - pow((double)(1 + e), (double)(-interval));

 

# 原始代码
grad[i_pt] = min(exp_d[i_pt], 1e10) * pow((1+exp_d[i_pt]), (-interval-1)) * interval * grad_back[i_pt];

# 修改为

grad[i_pt] = min(exp_d[i_pt], 1e10) * pow((double)(1+exp_d[i_pt]), (double)(-interval-1)) * interval * grad_back[i_pt];

修改完这两行代码后,编译就可以顺利通过了

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### 问题分析与解决 在编译 `nms_rotated_cuda.cu` 文件时,遇到错误提示“4 errors in compiling nms_rotated_cuda.cu CUDA nvcc exit code 1”,这表明编译器在处理 CUDA 源代码时遇到了问题。以下是对该问题的详细分析和解决方案。 #### 1. 编译器环境配置检查 确保 CUDA 工具链正确安装并配置。如果使用的是 Windows 系统,需确认以下内容: - CUDA Toolkit 的版本是否与显卡驱动兼容[^2]。 - 环境变量中是否正确设置了 `CUDA_PATH` 和 `PATH`,例如指向 `C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\bin`[^3]。 #### 2. 错误日志分析 需要查看完整的编译错误日志以定位具体问题。常见的错误类型包括但不限于: - **语法错误**:检查 CUDA 内核代码中的语法问题,例如缺失分号或括号不匹配。 - **头文件路径问题**:确保所有依赖的头文件路径已通过 `-I` 参数传递给 `nvcc`。 - **架构支持问题**:确认目标架构(如 `sm_70`)是否被正确指定。可以通过添加编译选项 `--gpu-architecture=sm_70` 来指定目标架构[^4]。 #### 3. 代码示例与修正 以下是一个典型的 CUDA 内核调用示例,展示如何避免常见错误: ```cpp // Example of a simple CUDA kernel __global__ void addKernel(int *c, const int *a, const int *b, int size) { int i = blockIdx.x * blockDim.x + threadIdx.x; if (i < size) { c[i] = a[i] + b[i]; } } // Host function to invoke the kernel void launchAddKernel(int *c, const int *a, const int *b, int size) { int threadsPerBlock = 256; int blocksPerGrid = (size + threadsPerBlock - 1) / threadsPerBlock; addKernel<<<blocksPerGrid, threadsPerBlock>>>(c, a, b, size); } ``` 上述代码展示了如何正确定义和调用 CUDA 内核。如果 `nms_rotated_cuda.cu` 中存在类似的内核调用,请检查其参数列表和内存分配逻辑是否正确[^5]。 #### 4. 常见问题排查 - **显存不足**:如果数据量过大,可能导致显存溢出。尝试减少输入数据规模或优化内存使用。 - **编译选项冲突**:某些编译选项可能与当前 CUDA 版本不兼容。建议使用官方推荐的默认选项,并逐步调整[^6]。 #### 5. 调试工具推荐 可以使用 NVIDIA 提供的调试工具来进一步分析问题: - `cuda-memcheck`:检测内存访问错误。 - `Nsight Systems` 和 `Nsight Compute`:提供性能分析和调试功能[^7]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值