BundleFusion在win10环境下使用RealSense D435i相机实现室内实时稠密三维重建
网上很多教程说明必须在使用vs2013+cuda8.0才能配置成功,经过本人研究在vs2013和vs2019环境下均能配置成功。同时在配置中有一个中重要的发现,RTX显卡和GTX显卡环境配置中存在差异,RTX显卡下生成的FriedLiver.exe存在无响应问题,具体解决办法如下。
1、配置环境说明
本人在以下版本均配置成功
vs2013 + cuda 11.1 + RTX3090
vs2013 + cuda8.0 + RTX3090
vs2019 + cuda 11.1 + RTX3090
vs2019 + cuda 8.0 + RTX3090
2、配置教程参考
(1)https://blog.csdn.net/weixin_42203839/article/details/116195977
(2)https://zhuanlan.zhihu.com/p/404537845
(3)https://blog.csdn.net/shenggedeqiang/article/details/108333848
3、FriedLiver.exe无响应解决办法
按以上教程配置完成编译基本不会出现什么问题,但是RTX显卡下可能存在FriedLiver.exe无响应,直接卡死,如下图所示
3.1分析错误原因:
在RTX显卡上运行BundleFusion会导致GPU挂起,原因是线程同步错误。出于某些原因,这个问题不会发生在以前的显卡上。
3.2修改办法
通过将有条件的__syncthreads()调用替换为无条件调用,修复__global__ void ComputeOrientation_Kernel(…)中的同步错误。线程同步需要所有线程到达调用,否则GPU挂起并等待剩余的线程,这当然不会因为if条件而发生。
修改FriedLiver\Source\SiftGPU\ProgramCU.cu文件
if (tidx < 36) {
volatile float* source = vote;
volatile float* target = vote_tmp;
#pragma unroll
for (int i = 0; i < 6; i++) {
const unsigned int m = (tidx + 36 - 1) % 36;
const unsigned int c = (tidx);
const unsigned int p = (tidx + 1) % 36;
target[tidx] = (source[m] + source[c] + source[p])*one_third;
__syncthreads();
volatile float *tmp = source;
source = target;
target = tmp;
}
替换为
if (tidx < 36) {
volatile float* source = vote;
volatile float* target = vote_tmp;
#pragma unroll
for (int i = 0; i < 6; i++) {
const unsigned int m = (tidx + 36 - 1) % 36;
const unsigned int c = (tidx);
const unsigned int p = (tidx + 1) % 36;
target[tidx] = (source[m] + source[c] + source[p])*one_third;
__threadfence();
volatile float *tmp = source;
source = target;
target = tmp;
}
3.3修改代码下载替换
也可以直接下载我修改好的文件,替换SiftGPU文件夹。链接:https://pan.baidu.com/s/1xPNhaazwkFoYub-Uxm5RuA ;提取码:tohk
重新编译,双击FriedLiver.exe,可运行,运行结果如下
最后含泪说明:本人从环境配置到生成FriedLiver.exe这一步花了将近一周时间,中间各种更换VS和CUDA版本,测试发现在各种版本下均可生成FriedLiver.exe。针对FriedLiver.exe无响应又花了一周时间,真不容易,配置中存在问题的小伙伴欢迎咨询。