[英]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 ++编译中的代码,则必须执行以下两项操作:
.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.