2013-03-28 30 views
2

我试图在CUDA中使用我的C++类。在CUDA中有选择地编译头文件和类函数

我有一类这样:

#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

我用nvcc使用stl类,如字符串或向量,没有问题。你当然不能将字符串发送到内核,或者在内核中使用字符串函数,但是看起来不像你想要做的那样......你应该只能删除“__device__”装饰。 – IdeaHat

+0

MadScienceDreams对我的问题的回答是正确的。然而,这个问题的根本问题在这里找到了它的解决方案:http://stackoverflow.com/questions/5994005/cuda-external-calls-not-supported – PaulD

+1

更具体地说,您需要在CUDA C中包含-dc标志/ C++编译器允许多个cu文件之间的链接。 – PaulD

回答

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(); 
     } 
} 

请注意,你必须把阶级从设备移动到承载此内存“工作”正常。如果您尝试对类进行任何操作(例如多态),这可能会炸毁。

+0

我认为CUDA5.0允许多态吗?我的“exampleClass”是一个包含多个派生类的基类。而且,exampleClass包含了保存多态类的几个点。 – PaulD

+0

@PaulD。呵呵,这是从4.0开始的一个很酷的变化。 CUDA是少数几款似乎每年都会添加漂亮功能的软件包之一!这些类的VTable必须同时引用'__host__'和'__device__'函数指针,所以类的大小会变得非常快。请注意,虚拟继承仍然不受支持。 – IdeaHat

+0

我不熟悉VTable ......我不仅仅是一个自我教导。你可以解释一下或发布链接?同时,nVidia网站也表示,自Toolkit 4.0以来,虚拟继承得到了支持。 https://developer.nvidia.com/cuda-toolkit-40 – PaulD