欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CUDA error 应输入表达式的几个坑点

程序员文章站 2022-07-12 20:02:49
...

因为需要使用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();

    ……
}

具体原因有两个:

  1. 全局变量惹的祸

在.cu文件上头我定义了几个全局变量,这几个全局变量在pro_fft()函数中同样被使用了。然而,有__global__标识符的函数是要放到GPU中去计算的!!定义的全局变量存储在CPU中,这就导致了GUP根本就不认识这里的x和y是谁!!

改正方法:不使用全局变量,需要使用的作为参数传递进来。

  1. 同步函数的错

这个错误非常隐蔽,当我发现时真是气的要吐血。使用同步函数__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();

    ……
}

顺便说下,即使这样,也还是会有报错,但此时代码已经能够正常使用了。

相关标签: CUDA