Cuda:混合c++和Cuda代码
Cuda : mix c++ and cuda code
我的问题如下:我想将cuda代码添加到已经存在的c++库中,并尽可能多地重用我现有的代码。为了使用多态性,我使用了模板类和模板内核。因此,所有内容都在.cpp、.h和.cuh文件中实现。不涉及.cu文件,因此不使用nvcc,并且c++编译器阻塞<lt<>>>内核调用语法。
我已经看过了[如何将内核文件CUDA与主.cpp文件和[如何从C++头文件调用CUDA文件?但我找不到任何能解决我问题的设计。
涉及的文件:
main.cpp
插入我已经存在的一堆类,将它们传递给一个CudaPrepare类,该类负责编写这些类,并负责准备要传递给只有基元类型的cuda代码的数据。
#include "CudaPrepare.h"
#include "CudaSpecificType1.h"
#include "A.h" //already existing classes
#include "B.h" //already existing classes
void main()
{
A a(...);
B b(...);
CudaSpecificType1 cudaType(...);
CudaPrepare<CudaSpecificType> cudaPrepare(a, b, cudaType);
cudaPrepare.run();
}
CudaSpecificType1.cuh
class CudaSpecificType1
{
protected:
/*
a few members
*/
public:
CudaSpecificType1(...) : /*initializations*/ {}
float polymorphicFunction(/*args*/);
};
CudaPrepare.h
#include "A.h" //already existing classes
#include "B.h" //already existing classes
template<typename T>
class CudaPrepare
{
protected:
const A& a;
const B& b;
const T& t;
public:
CudaPrepare(const A& a, const B& b, const T& t): A(a), B(b), T(t) {/*some initialization stuff*/}
void run() const
{
/*
data preparation : various discretizations, sticking to primitive type only, casting to single precision etc...
*/
CudaClass<T> cudaClass(t, /*all the prepared data here*/);
cudaClass.run();
}
};
CudaClass.cuh
template <typename T>
__global__ void kernel(const T t, /*other args*/, float* results)
{
int threadId = ...;
results[threadId] = t.polymorphicFunction(...);
}
template<typename T>
class CudaClass
{
protected:
const T& t;
/*
all the prepared data with primitive types
*/
public:
CudaClass(const T& t, ...) : t(t) /*other initialization*/ {}
void run() const
{
/*
grid size calculation, cuda memory allocation, data transfer to device...
*/
//kernel invocation
kernel<T><<</*grid & block size*/>>>(/*args*/);
/*
clean up with cudaFree(...);
*/
}
};
c++编译器在内核调用时按预期给出错误。CudaClass::run()无法移动到.cu文件中,因为该类是模板化的。我唯一能想到的就是引入一个.cu文件来代替main.cpp/或包含一个从main.cpp调用的存根,但是nvcc不能处理一些c++11特性。特别是,A.h和B.h包含许多枚举类。。。
我用Cuda 7.0进行了实验(之前是6.5)。遗憾的是,似乎仍然没有支持(至少)以下c++11功能:
-
枚举类
-
最终关键字
-
基于距离的环路
然而,正如Robert Crovella所建议的,显式模板实例化解决了这个问题。
CudaClass.cuh必须一分为二:
CudaClass.cuh
template <typename T>
__global__ void kernel(const T t, /*other args*/, float* results)
{
int threadId = ...;
results[threadId] = t.polymorphicFunction(...);
}
template<typename T>
class CudaClass
{
protected:
const T& t;
/*
all the prepared data with primitive types
*/
public:
CudaClass(const T& t, ...) : t(t) /*other initialization*/ {}
void run() const;
};
CudaClass.cu
#include "CudaClass.cuh"
//explicit instantiation, so that the kernel invocation can be in a .cu file
template class CudaClass<CudaSpecificType1>;
/*
other explicit instantiations for various types
*/
template<typename T>
void run() const
{
/*
grid size calculation, cuda memory allocation, data transfer to device...
*/
//kernel invocation
kernel<T><<</*grid & block size*/>>>(/*args*/);
/*
clean up with cudaFree(...);
*/
}
相关文章:
- 通过Python Distutils(用于Python C扩展)使用可重定位的设备代码编译CUDA代码
- 使用 msvc 15 在 Qt5.13 中编译 CUDA 代码
- 编译/添加 cuda 代码到现有项目 (CMake)
- TensorFlow CPU 和 CUDA 代码共享
- 我可以从 c++ 调用用 cupy 代码编写的 cuda 代码吗?
- 编译 .cu 与 .cpp:即使没有任何 CUDA 代码,编译器也会出错
- 为什么在循环中重复一个内核会使CUDA代码明显较慢
- 为什么CMAKE add_依赖项不适用于使用CUDA代码的库
- GPU cuda 代码是否适用于多个 GPU 卡而无需任何实现
- 如何修改CUDA代码以获得100%的GPU负载
- Cuda:混合c++和Cuda代码
- 在Windows上用Qt Creator编译Cuda代码
- CUDA代码使用C++头结构
- 编译一个不支持c++11和.cxx文件的cuda代码需要一个带有vexcl示例的c++11
- nVidia CUDA 代码不起作用?
- 为什么在指定-rdc=true时,cuda代码运行得慢得多
- 在VS 2010中将CUDA代码编译为二进制文件C++
- 使用分支优化 CUDA 代码
- c++ Cuda 代码未运行内核
- 为什么我的 CUDA 代码无法正常工作,无法零填充大型矩阵