gpt4 book ai didi

c++ - 在 CUDA 中有选择地编译头文件和类函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:51:11 27 4
gpt4 key购买 nike

我正在尝试在 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 中是可能的。我错了吗?

最佳答案

构建了以下代码,但我没有运行它:

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

请注意,您必须将类从设备移动到主机内存才能使其正常“工作”。如果您尝试对这些类做任何花哨的事情(例如多态性),这可能会失败。

关于c++ - 在 CUDA 中有选择地编译头文件和类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15690790/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com