随着cutil.h header 从CUDA示例中删除,引入了一些新 header ,例如helper_cuda.h,helper_functions.h。

我使用的主要关键字之一是CUDA_CHECK_ERROR,我认为它已被checkCudaErrors取代。

在我的大多数代码中,宏都可以编译并正常工作。但是,当我在具有名为check(..)的函数的类中使用它时,checkCudaErrors函数会给出编译错误。

这是一个例子:

#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;
}

以及编译结果:(使用GCC 4.5编译时也会看到相同的错误!)
1>------ Build started: Project: ZERO_CHECK, Configuration: Release x64 ------
2>------ Build started: Project: massivecc, Configuration: Release x64 ------
2>  trivial_main.cpp
2>..\src\trivial_main.cpp(19): error C2660: 'Trivial<T>::check' : function does not     take 4 arguments
2>          with
2>          [
2>              T=int
2>          ]
2>          ..\src\trivial_main.cpp(18) : while compiling class template member         function 'void Trivial<T>::initialize(void)'
2>          with
2>          [
2>              T=int
2>          ]
2>          ..\src\trivial_main.cpp(29) : see reference to class template         instantiation 'Trivial<T>' being compiled
2>          with
2>          [
2>              T=int
2>          ]
3>------ Skipped Build: Project: ALL_BUILD, Configuration: Release x64 ------
3>Project not selected to build for this solution configuration
========== Build: 1 succeeded, 1 failed, 1 up-to-date, 1 skipped ==========

当我删除模板参数时,也会发生相同的错误。

最佳答案

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

#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;
}

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

关于sdk - CUDA 5.0 : checkCudaErrors fails to find correct “check” method if class has a “check” method,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13982308/

10-09 14:54