CUDA error 应输入表达式的几个坑点
因为需要使用GUP并行计算,所以找了一些关于CUDA的资料看,差不多弄懂原理后开始尝试写自己的代码,谁知马上遇到了第一个拦路虎——调用核函数时老是说<<< >>>没有定义,连编译都没法通过!
查找相应的资料,大部分都说这是因为编译器不同的原因,.cu文件和.cpp文件的编译是不同的。在.cpp文件与.cu文件混合编写时,不应该在.cpp文件里出现.cu文件的函数,而是应该使用外部拓展c标识符。我的程序恰好存在这方面的问题,于是我重新整理了程序,完全按照网上示例程序的组织方式,然后运行,结果还是不行——<<< >>>应该输入表达式…………
再次仔细检查,依然不知道哪里错了。上网查找资料,总说纷纭,有说环境变量是中文名的造成的,有说CUDA没配置好的,甚至还有说是机器的硬件配置不支持的……这些都被推翻了——我新建了一个官方例程CUDA Runtime,完美执行……
到底是什么原因?最终解决了。问题还是出现在核函数kernel本身。概括来说就是:__global__定义的核函数kernel中有未定义的标识符,结果这个error没有能够定位好,就让<<< >>>给背锅了!!
出错部分代码如下:
int x = 0;
int y = 0;
//GPU上执行的部分
__global__ void pro_fft(float *pro)
{
//GUP计算索引
int m = blockIdx.x;
int j = blockIdx.y;
int i = threadIdx.x;
int num = m*x*y + j * y + i; //减少乘除法
……
extern __shared__ float ps[];
ps[i] = (pro[num - i] + pro[num - i + 1]) / 2.0;
_syncthreads();
……
}
具体原因有两个:
- 全局变量惹的祸
在.cu文件上头我定义了几个全局变量,这几个全局变量在pro_fft()函数中同样被使用了。然而,有__global__标识符的函数是要放到GPU中去计算的!!定义的全局变量存储在CPU中,这就导致了GUP根本就不认识这里的x和y是谁!!
改正方法:不使用全局变量,需要使用的作为参数传递进来。
- 同步函数的错
这个错误非常隐蔽,当我发现时真是气的要吐血。使用同步函数__syncthreads();时我们需要写的是:
__syncthreads();
而不是
_syncthreads();
两者有什么区别?第一个有两个下划线,而第二个只有一个下划线!
这种事多发生在VS没有成功代码提醒这个函数,只能手动输入的情况下。
同时在使用这个函数时,需要手动添加头文件
#include "device_functions.h"
更正后的代码:
#include "device_functions.h"
//GPU上执行的部分
__global__ void pro_fft(float *pro,interesting下,int x,int y)
{
//GUP计算索引
int m = blockIdx.x;
int j = blockIdx.y;
int i = threadIdx.x;
int num = m*x*y + j * y + i; //减少乘除法
……
extern __shared__ float ps[];
ps[i] = (pro[num - i] + pro[num - i + 1]) / 2.0;
__syncthreads();
……
}
顺便说下,即使这样,也还是会有报错,但此时代码已经能够正常使用了。
上一篇: 【OpenMP学习笔记】1:基本使用和critical指令
下一篇: Pytorch学习之cuda