Sdk CUDA 5.0:checkCudaErrors未能找到正确的;勾选“;方法,如果类有一个;勾选“;方法

Sdk CUDA 5.0:checkCudaErrors未能找到正确的;勾选“;方法,如果类有一个;勾选“;方法,sdk,cuda,compiler-errors,sample,Sdk,Cuda,Compiler Errors,Sample,随着CUDA示例中cutil.h头的删除,引入了一些新头,如helper\u CUDA.h、helper\u functions.h 我使用的一个主要关键字是CUDA_CHECK_ERROR,我想它被checkCudaErrors取代了 在我的大多数代码中,宏都能编译并运行良好。然而,当我在一个名为check(..)的类中使用它时,checkCudErrors函数会给出编译错误 以下是一个例子: #include <stdio.h> #include <cuda_runtim

随着CUDA示例中cutil.h头的删除,引入了一些新头,如helper\u CUDA.h、helper\u functions.h

我使用的一个主要关键字是CUDA_CHECK_ERROR,我想它被checkCudaErrors取代了

在我的大多数代码中,宏都能编译并运行良好。然而,当我在一个名为check(..)的类中使用它时,checkCudErrors函数会给出编译错误

以下是一个例子:

#include <stdio.h>

#include <cuda_runtime.h>
#include <helper_cuda.h>
#include <helper_functions.h>

template<typename T>
class Trivial {

public:

    void check()
    {

    }

    void initialize() 
    {
        checkCudaErrors(cudaMalloc(NULL, 1));
    }

    T val;

};

int main(int argc, char **argv)
{

    Trivial<int> tt;

    tt.initialize();

    return 0;
}
#包括
#包括
#包括
#包括
样板
类平凡{
公众:
无效检查()
{
}
void initialize()
{
检查CUDAERRORS(cudaMalloc(NULL,1));
}
T值;
};
int main(int argc,字符**argv)
{
琐碎的tt;
tt.initialize();
返回0;
}
编译结果:(使用GCC4.5编译时也会看到相同的错误!)

1>----构建已启动:项目:零检查,配置:版本x64------
2> ----已开始构建:项目:massivecc,配置:版本x64------
2> 普通_main.cpp
2> ..\src\triatile_main.cpp(19):错误C2660:“triatile::check”:函数不接受4个参数
2> 与
2>          [
2> T=int
2>          ]
2> ..\src\tritile_main.cpp(18):编译类模板成员函数“void tritile::initialize(void)”时
2> 与
2>          [
2> T=int
2>          ]
2> ..\src\triple_main.cpp(29):请参阅正在编译的类模板实例化'triple'的参考
2> 与
2>          [
2> T=int
2>          ]
3> ----跳过生成:项目:所有生成,配置:版本x64------
3> 未选择要为此解决方案配置生成的项目
=========生成:1个成功,1个失败,1个最新,1个跳过==========
删除模板参数时也会出现同样的错误。

我必须将check(..)函数的定义从helper_functions.h复制到类的头中才能编译该类

#include <stdio.h>    
#include <cuda_runtime.h>
#include <helper_cuda.h>
#include <helper_functions.h>    
class Trivial {    
public:    
    template< typename T >
    bool check(T result, char const *const func, const char *const file, int const line)
    {
        if (result) {
            fprintf(stderr, "CUDA error at %s:%d code=%d(%s) \"%s\" \n",
            file, line, static_cast<unsigned int>(result), _cudaGetErrorEnum(result), func);
            return true;
        } else {
            return false;
        }
    }

    void check() {  }

    void initialize() 
    {
        checkCudaErrors(cudaMalloc(NULL, 1));
    }
};

int main(int argc, char **argv)
{
    Trivial tt;
    tt.initialize();    
    return 0;
}
#包括
#包括
#包括
#包括
类平凡{
公众:
模板
布尔检查(T结果、字符常量*常量函数、常量字符*常量文件、整数常量行)
{
如果(结果){
fprintf(标准,“CUDA错误在%s:%d代码=%d(%s)\%s\”\n”,
文件、行、静态类型转换(结果)、cudaGetErrorEnum(结果)、函数;
返回true;
}否则{
返回false;
}
}
无效检查(){}
void initialize()
{
检查CUDAERRORS(cudaMalloc(NULL,1));
}
};
int main(int argc,字符**argv)
{
琐碎的tt;
tt.initialize();
返回0;
}

因此,这主要解决了我的问题,我的代码编译成功。

参考了helper_cuda.h第680行中的源代码

您会发现CheckCudErrors声明了一个#define checkCudErrors(val)检查((val),#val,文件),它接受一个参数并根据配置使用其他三个参数调用check。请注意,第680行中也定义了它


而在您的例子中,您定义了一个不接受任何参数的检查。不同的声明和定义,多个定义。

我必须将check(..)函数定义复制到我的类的标题中,以便能够编译该类(我的真实代码,不是这个示例,但它是类似的)。也许您可以添加您的解决方案作为答案并接受它,以便将此问题从未回答的问题列表中删除。
#include <stdio.h>    
#include <cuda_runtime.h>
#include <helper_cuda.h>
#include <helper_functions.h>    
class Trivial {    
public:    
    template< typename T >
    bool check(T result, char const *const func, const char *const file, int const line)
    {
        if (result) {
            fprintf(stderr, "CUDA error at %s:%d code=%d(%s) \"%s\" \n",
            file, line, static_cast<unsigned int>(result), _cudaGetErrorEnum(result), func);
            return true;
        } else {
            return false;
        }
    }

    void check() {  }

    void initialize() 
    {
        checkCudaErrors(cudaMalloc(NULL, 1));
    }
};

int main(int argc, char **argv)
{
    Trivial tt;
    tt.initialize();    
    return 0;
}