CUDA - nvcc -G - 如果工作不正常
CUDA - nvcc -G - if not working properly
我目前正致力于在 CUDA 中移植熔岩流模型(完整代码在 github 此处:Full source of the CUDA-SCIARA Fv2 lava flow model .
编辑
为了重现该问题,请使用 github 自述文件中的说明以获得项目 SCIARA_FV2_CUDA_MULTICELLS 的开发副本。然后在没有 -G 选项的情况下编译并作为命令行参数传递 -c ../data/2006/PARAMETERS.cfg 。 (引用的代码位于 file 中的第 260 行)
我在 __device__
函数中遇到 if 构造问题。
根据当前的熔岩数量和温度计算新温度,如果它低于常数参数(变量 d_PTsol=1143.0
),熔岩就会固化。
下面代码中的问题是,如果我使用 -G 选项(用于生成设备代码调试信息)进行编译,它可以完美运行,但如果不使用它,则会出现错误。
double new_temp = d_computeNewTemperature(sommah,sommath);
if(new_temp <= d_PTsol){
printf("Solidified %.5f,%.5f\n",new_temp,d_PTsol);
double newQuote = d_sbts_updated[d_getIdx(row,col,ALTITUDE)]+d_sbts_current[d_getIdx(row,col,THICKNESS)];
//CODE FOR LAVA SOLIDIFICATION HERE
}else{
//there is lava and is not solidified -> activate this cell!
adjustAdaptiveGrid(row,col);
}
在模拟的某个时刻输出这样的东西:
Solidified 1344.68654 1143.00000
Solidified 1343.99509 1143.00000
Solidified 1320.50061 1143.00000
Solidified 1325.53942 1143.00000
如果我将 if 条件更改为严格的不等式 if(new_temp < d_PTsol)
.
,则问题将完全消失
使用以下选项并在单独编译模式下进行编译
-O3 -Xcompiler -fPIC -std=c++11
并使用
链接
--cudart static --relocatable-device-code=true -gencode arch=compute_35,code=compute_35 -gencode arch=compute_35,code=sm_35
有人遇到过类似的问题吗?我做错了什么吗?
更新
这个问题似乎与使用 <= as 条件的 if else 结构的翻译有某种关系。翻译
if(new_temp <= d_PTsol) {
//solidification
}else{
//something else
}
至
if(new_temp <= d_PTsol) {
//solidification
}
if(!(new_temp <= d_PTsol)){
//something else
}
使代码完美运行。
我遇到了类似的问题。我的代码使用 -G 选项但并非没有。我只需要将 -fmad=false 和 -prec-div=false 添加到编译器选项(有关更多信息,请参阅:http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#options-for-steering-gpu-code-generation)。
默认情况下,此值为 true 并优化您的单精度操作,但会以精度为代价。如果您启用调试模式,此优化将被禁用。我需要精确的值,因此我的代码只适用于 -G。也许你有类似的问题。 (有关 CUDA 浮点精度的更多信息:http://docs.nvidia.com/cuda/cuda-c-programming-guide/#mathematical-functions-appendix)
我目前正致力于在 CUDA 中移植熔岩流模型(完整代码在 github 此处:Full source of the CUDA-SCIARA Fv2 lava flow model .
编辑
为了重现该问题,请使用 github 自述文件中的说明以获得项目 SCIARA_FV2_CUDA_MULTICELLS 的开发副本。然后在没有 -G 选项的情况下编译并作为命令行参数传递 -c ../data/2006/PARAMETERS.cfg 。 (引用的代码位于 file 中的第 260 行)
我在 __device__
函数中遇到 if 构造问题。
根据当前的熔岩数量和温度计算新温度,如果它低于常数参数(变量 d_PTsol=1143.0
),熔岩就会固化。
下面代码中的问题是,如果我使用 -G 选项(用于生成设备代码调试信息)进行编译,它可以完美运行,但如果不使用它,则会出现错误。
double new_temp = d_computeNewTemperature(sommah,sommath);
if(new_temp <= d_PTsol){
printf("Solidified %.5f,%.5f\n",new_temp,d_PTsol);
double newQuote = d_sbts_updated[d_getIdx(row,col,ALTITUDE)]+d_sbts_current[d_getIdx(row,col,THICKNESS)];
//CODE FOR LAVA SOLIDIFICATION HERE
}else{
//there is lava and is not solidified -> activate this cell!
adjustAdaptiveGrid(row,col);
}
在模拟的某个时刻输出这样的东西:
Solidified 1344.68654 1143.00000
Solidified 1343.99509 1143.00000
Solidified 1320.50061 1143.00000
Solidified 1325.53942 1143.00000
如果我将 if 条件更改为严格的不等式 if(new_temp < d_PTsol)
.
使用以下选项并在单独编译模式下进行编译
-O3 -Xcompiler -fPIC -std=c++11
并使用
链接--cudart static --relocatable-device-code=true -gencode arch=compute_35,code=compute_35 -gencode arch=compute_35,code=sm_35
有人遇到过类似的问题吗?我做错了什么吗?
更新
这个问题似乎与使用 <= as 条件的 if else 结构的翻译有某种关系。翻译
if(new_temp <= d_PTsol) {
//solidification
}else{
//something else
}
至
if(new_temp <= d_PTsol) {
//solidification
}
if(!(new_temp <= d_PTsol)){
//something else
}
使代码完美运行。
我遇到了类似的问题。我的代码使用 -G 选项但并非没有。我只需要将 -fmad=false 和 -prec-div=false 添加到编译器选项(有关更多信息,请参阅:http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#options-for-steering-gpu-code-generation)。
默认情况下,此值为 true 并优化您的单精度操作,但会以精度为代价。如果您启用调试模式,此优化将被禁用。我需要精确的值,因此我的代码只适用于 -G。也许你有类似的问题。 (有关 CUDA 浮点精度的更多信息:http://docs.nvidia.com/cuda/cuda-c-programming-guide/#mathematical-functions-appendix)