我正在尝试在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上可执行,同时保持在主机端进行分析和输出的精美主机操作的能力。
更新:我的最终目标是拥有一个基类,包含几个多态类的指针类型。这个基类本身是可派生的。我认为这在CUDA5.0中是可行的。我错了吗?
答案 0 :(得分:2)
以下代码构建,但我没有运行它:
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();
}
}
请注意,您必须将类从设备移动到主机内存才能正常“正常工作”。如果您尝试对类进行任何操作(例如多态),这可能会爆炸。