CUDA内核和printf的奇怪行为
CUDA kernel and printf strange behaviour.
我写了简单的内核代码,试图操作一维数组元素:
#include "stdio.h"
__global__ void Loop(double *X, int CellsNum, int VarNum,const double constant1)
{
int idx = threadIdx.x+blockDim.x*blockIdx.x;
int i = (idx+1)*VarNum ;
double exp1,exp2,exp3,exp4 ;
if(idx<CellsNum-2) {
exp1=double(0.5)*(X[i+6+VarNum]+X[i+6])+X[i+10] ;
exp2=double(0.5)*(X[i+8+VarNum]+X[i+8]) ;
if(i==0) {
printf("%e %e",exp1,exp2) ;
}
exp3=X[i+11]-constant1*(exp1*exp2)/X[i+5] ;
exp4=constant1*(X[i+9]*exp1-X[i+9-VarNum]*exp2)/X[i+5] ;
X[i+12]=exp3+exp4;
}
}
extern "C" void cudacalc_(double *a, int* N1, int* N2, double* N3)
{
int Cells_Num = *N1;
int Var_Num = *N2;
double constant1 = *N3;
Loop<<<1,Cells_Num>>>(a,Cells_Num,Var_Num,constant1);
}
但如果我评论这段代码,它就不起作用了:
if(i==0) {
printf("%e %e",exp1,exp2) ;
}
即使变量i总是大于零。然后我评论这行代码在X数组中生成NaN。我正试图在特斯拉GPU上运行这段用-arch sm_20标志编译的代码。也许有人能帮我解决这个问题?
这个内核有机会出现竞争条件,因为内核代码在没有同步或保护的情况下从X
读取和写入X
。
解决此问题的最简单方法可能是将输出语句分离以写入不同的数组:
Xo[i+12]=exp3+exp4;
cuda-memcheck
可以帮助检查内核中的竞争条件。使用cuda-memcheck --help
查找特定的racecheck
选项。
相关文章:
- 如何在内核C++中使用1920x1080x16M图形或类似的16M颜色?(VGA)
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 内联程序集printf将整数解释为地址
- CUDA内核和数学函数的显式命名空间
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- C++内核出现Jupyter笔记本错误
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 内存围栏是否涉及内核
- C++ Setter/Getter,cout 工作,printf 失败
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数
- Printf 命令不打印时添加了查找常见除数的新代码
- SIGSEGV, 分段错误. 而 printf() 数组索引的值
- 为什么在包含iostream时可以使用printf()?
- OpenCL 内核参数中的字符***?
- CUDA内核printf()在终端中不产生输出,在探查器中工作
- OpenCL -- 不同的设备上有不同的内核"printf()"结果?
- CUDA 5.5 : 我不能在内核方法中使用"printf",我应该在 VisualStucio2010 "compute_xx,sm_xx" 中选择哪个设备?
- CUDA内核和printf的奇怪行为
- 在内核外部使用CUDA printf来打印设备变量