gcc7的NVCC错误

时间:2018-07-26 18:25:28

标签: c++ cuda nvcc

我有以下代码,只有cuda9 + gcc7才有错误。 Cuda9 + gcc6没有编译错误。

这是我为该错误编写的最少的复制程序。我怀疑这是编译器错误,但我必须修复代码才能与gcc7一起使用。我想知道一种解决方法,以摆脱编译错误。

Cuda编译工具,版本9.2,V9.2.148

gcc版本7.3.0(Ubuntu 7.3.0-21ubuntu1〜16.04)

错误:

var MissionTwoSets = db.Setalets
    .Where(x => x.Bolum == 2 && x.SetId==setAlet.SetId)
    .Include(x => x.Aletler.AletAD)
    .Include(x => x.Setler)
    .AsEnumerable() // <-- switch to LINQ to Objects
    .GroupBy(x => x.SetId)
    .ToList();

// op.h

$ nvcc test.cu
test.h: In constructor 'TestOp::TestOp()':
test.h:6:54: error: 'Dummy' is not a member of 'TestOp'

// test.cu

   class OperatorBase {
     public:
      template <typename T>
      inline bool Dummy(T default_value) {
        return true;
      }
    };

    template <class Context>
    class Operator : public OperatorBase {
    };

// test.h

#include "test.h"

1 个答案:

答案 0 :(得分:2)

CUDA 9.2 nvcc C ++前端正在对您的代码执行此操作:

class OperatorBase { 
    public: 
        template< class T> bool 
            Dummy(T default_value) { 
                return true; 
            } 
}; 

template< class Context> 
class Operator : public OperatorBase { 
}; 

template< class Context> 
class TestOp : public Operator< Context>  { 
    public: 
        TestOp() 
            : msg_(
                    this->OperatorBase::template Dummy< bool> (true)) { } 

    private: 
        bool msg_; 
}; 

在编译该代码时,g ++-7(并且只有g ++-7或更高版本)似乎有名称查找失败。我对C ++知之甚少,无法说明它为什么失败以及实际上是否应该失败。我可以说这不是CUDA前端的新行为-我测试过的每个版本的CUDA 9和CUDA 8都发出相同的代码。

您可以通过以其他方式实现名称解析来避免这种情况:

template <class Context>
class TestOp : public Operator<Context> {
    public:
        TestOp()
            : msg_(
                    //OperatorBase::Dummy<bool>(true)) {}
                    this->template Dummy<bool>(true)) {}
    private:
        bool msg_;
};

虽然这有点老套,但可以使用CUDA 9.2和gcc-4.8,gcc-5.4和gcc-7进行编译。如果using冒犯了您的敏感性,您可能会尝试基于this->别名的第三种解决方案。