CUDA 5.0: checkCudaErrors fails to find correct “check” method if class has a “check” method

无人久伴 提交于 2019-12-11 13:04:00

问题


As the cutil.h header is removed from CUDA Samples, some new headers are introduced like helper_cuda.h, helper_functions.h.

One of the main keywords that is used by me was CUDA_CHECK_ERROR, and I think it is replaced with checkCudaErrors.

In most of my code the macro compiles and works well. However when I use it in a class which has a function named check(..), checkCudaErrors function gives compile errors.

Here is an example:

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

and the result of compilation: (the same error is seen when compiled with GCC 4.5 also!)

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 ==========

The same error is taken when I removed the template parameter.


回答1:


I had to copy the check(..) function's definition from helper_functions.h into my class's header to be able to compile the class.

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

So, this mainly solved my problem and my code compiled successfully.




回答2:


with reference to the source code found in helper_cuda.h on line 680

https://github.com/pathscale/nvidia_sdk_samples/blob/master/vectorAdd/common/inc/helper_cuda.h

you find checkCudaErrors declares a #define checkCudaErrors(val) check ( (val), #val, FILE, LINE ) which takes in a single argument and calls check with 3 other arguments based on config.Note that it is also defined in line 680

Whereas in your case, you define a check that does not take any argument. case of different declaration and definition, multiple definitions.



来源:https://stackoverflow.com/questions/13982308/cuda-5-0-checkcudaerrors-fails-to-find-correct-check-method-if-class-has-a-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!