繁体   English   中英

在通用类中将模板类与CUDA关键字一起使用

[英]Using Template Classes with CUDA keywords in generic classes

我创建了一个包装内核功能的模板类。 这样,当任何其他类需要使用内核时,它都可以简单地调用该类函数,而不必担心CUDA术语和功能。 由于该类是模板类,因此所有定义和声明都包含在同一文件中,如下所示。

Scanner.h

#include <iostream>
#include "ScanKernals.h"

class Scanner {
public :
    template<typename T>
    void ScanDevice(T * h_in, int size);

    template<typename T>
    void ScanHost();

};

template<typename T>
void Scanner::ScanHost()
{

}

template<typename T>
void Scanner::ScanDevice(T * h_in, int size)
{
  T * d_in;
  cudaMalloc(&d_in, size * sizeof(T));
  cudaMemcpy(d_in , h_in, size * sizeof(T), cudaMemcpyHostToDevice);
  // runs kernel that is required to calculate the scan 
}

ScanKernals.h

template<typename T>
__global__
void scan(T * d_in, T* d_out, int size)
{
   // keranel code
}

然后在主函数中使用上面的类,如下所示

main.cpp中

#include <iostream>
#include "Scanner.h"

int main()
{
    Scanner scanner;

    return 0;
}

但是,当我编译代码时,编译器会给出错误,但无法识别CUDA特定的关键字。

如果我将Scanner类的定义分离到单独的.cpp文件,则不会生成此错误,但是由于无法在两个单独的文件中声明和定义模板类 ,因此这不是一个选择

我在这里错过了什么吗,有解决方法吗?

如果您的代码路径包含将CUDA语法包含到C ++编译中的代码,则必须执行以下两项操作:

  1. 使用nvcc编译器驱动程序编译代码
  2. 重命名正在扩展名为.cu的文件。 nvcc使用文件扩展名确定给定文件的编译轨迹,如果文件扩展名为.cpp ,则代码将直接传递给主机编译器,并且编译将失败。

您显然没有做这些事情之一或可能做不到。

nvcc在文件上的默认行为不是您所期望的,因为@talonmies带下划线。 但是,您可能需要尝试以下编译器命令行选项:

--x {c|c++|cu}                             (-x)
    Explicitly specify the language for the input files, rather than letting
    the compiler choose a default based on the file name suffix.
    Allowed values for this option:  'c','c++','cu'.

明确指定输入代码为cuda,即使以.cpp后缀命名。 这是一个示例main.cpp文件:

__global__ void f() {}

没有标志:

/usr/local/cuda-7.5/bin/nvcc -c main.cpp
main.cpp:1:1: error: ‘__global__’ does not name a type
 __global__ void f() {}
 ^

带有标志(无错误):

/usr/local/cuda-7.5/bin/nvcc -c main.cpp -x cu

文件命名自由似乎很安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM