在CUDA中选择性地编译头文件和类函数
selectively compile headers and class functions in CUDA
我正在尝试在CUDA中使用我的c++类。
我有一个这样的类:
#include<string>
#include<stdlib.h>
class exampleClass{
int i;
__host__ __device__ exampleClass(int _i):i(_i){};
__host__ __device__ void increment(){i++;}
__host__ __device__ string outputMessage(return itoa(i);}
};
我已经在。cu文件中设置了这个,并设置为编译CUDA c/c++
使用nvcc编译失败,因为cuda没有字符串。
我想做的是通过做这样的事情来保留CUDA的功能:
#ifndef __CUDA_ARCH__
#include<string>
#endif
#include<stdlib.h>
class exampleClass{
int i;
__host__ __device__ exampleClass(int _i):i(_i){};
__host__ __device__ void increment(){i++;}
#ifndef __CUDA_ARCH__
string outputMessage(return itoa(i);}
#endif
};
但我知道这不起作用…至少,这对我不起作用。nvcc不喜欢包含字符串,显然,也不喜欢需要字符串类型的函数。
如果示例不是一流的,请向我道歉。总之,我想做的是让核心类成员在CUDA上可执行,同时保持在主机端进行分析和输出的花哨主机操作的能力。
UPDATE:我的最终目标是有一个基类,包含几个指向多个多态类的指针类型。这个基类本身是可衍生的。我认为这在CUDA5.0中是可能的。我错了吗?
构建了以下代码,尽管我没有运行它:
class exampleClass{
int i;
public:
__host__ __device__ exampleClass(int _i):i(_i){};
__host__ __device__ void increment(){i++;}
__host__ string outputMessage(){ return "asdf";}
};
__global__ void testkernel (
exampleClass *a,
int IH, int IW)
{
const int i = IMUL(blockIdx.x, blockDim.x) + threadIdx.x;
const int j = IMUL(blockIdx.y, blockDim.y) + threadIdx.y;
if (i<IW && j<IH)
{
const int i_idx = i + IMUL(j, IW);
exampleClass* ptr = a+i_idx;
ptr->increment();
}
}
__host__ void test_function(exampleClass *a,
int IH, int IW)
{
for (int i = 0; i < IW; i++)
for (int j = 0; j < IH; j++)
{
const int i_idx = i + j*IW;
exampleClass* ptr = a+i_idx;
cout << ptr->outputMessage();
}
}
请注意,您必须将类从设备移动到主机内存才能正常"工作"。如果您试图对这些类做任何奇怪的事情(例如,多态性),这可能会失败。
相关文章:
- 如何通过派生类函数更改基类中的向量
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 在类函数中初始化外部作用域变量
- c++ 在非类函数中使用类变量
- SDL_PollEvent() 无法捕获类函数内部SDL_QUIT?
- 从类成员函数到类 C 函数指针的转换
- 如何在模板类函数中分配结构值?
- 从类中的另一个文件请求函数不起作用
- C++中的类/函数模板占用了我的二进制文件的百分比是多少?
- 使用 extern "C"调用 C 文件中的C++类函数
- 嵌套模板类返回类型在 C++ 中的头文件中函数返回类型的语法
- c++为类和.cpp文件分离文件,函数不是类的一部分
- C++:定义类函数的.cpp文件中实例本身的表示关键字
- 头文件类成员函数声明错误:"incomplete type name in nested name specifier"
- 如何在C++中从类文件运行函数
- 将此c++代码分解为单独的类规范文件和函数定义文件
- 可从多个文件和函数c++访问的类值
- 在类函数内外写入文件
- 是否可以禁止在 "truly lazy" SWIG 接口文件中包含类/函数?
- 在CUDA中选择性地编译头文件和类函数