我编写了一个我在并行化(多[[cpu]线程)程序中使用的类。
我正在翻译该程序以在CUDA硬件上运行。 (GPGPU系统。)
我差不多了,但我遇到了以下错误:
calling a __host__ function("simulation::simulation") from a __global__ function("cuda_kernel_func") is not allowed
所以我知道我正在做的事情是不允许的,但我不知道为什么。我想知道:
也许答案很简单"你不能在CUDA"中使用课程和OOP?或许这可能是不正确的,答案是不同的。
解释我想要做的最简单的方法当然是向你展示一些代码,所以这里是我的CUDA内核函数:
(我已经从中删除了很多东西,其中大部分只是注释掉了[旧的]代码 - 所以希望我没有搞砸任何东西。)
......为基本看起来像是一个模糊的算法做好准备。
__global__
void cuda_kernel_func(std::mt19937_64 *gen_p, double *value, double *r1_value, uint64_t NUM_VALUES)
{
uint64_t index = blockIdx.x * blockDim.x + threadIdx.x;
if(index < NUM_VALUES)
{
const uint64_t NUM_REPEATS = 32;
double *d_array = (double*)malloc(NUM_REPEATS * sizeof(double));
for(uint64_t kx = 0; kx < NUM_REPEATS; ++ kx)
{
uint64_t NUM_RUNS = 1000;
int *d_log = (int*)malloc(NUM_RUNS * sizeof(int));
for(uint64_t run_ix = 0; run_ix < NUM_RUNS; ++ run_ix)
{
int NUM_C = 10;
simulation s(NUM_C, gen_p, r1_value[index]);
s.run(100 * NUM_C);
if(s.get() == true)
{
d_log[run_ix] = 1;
}
else
{
d_log[run_ix] = 0;
}
}
long long sum = 0;
for(uint64_t ix = 0; ix < NUM_RUNS; ++ ix)
{
sum += d_log[ix];
}
double ratio = (double)sum / (double)NUM_RUNS;
d_array[kx] = ratio;
free(d_log);
}
double mean = 0.0;
for(uint64_t kx = 0; kx < NUM_REPEATS; ++ kx)
{
mean += d_array[kx];
}
mean /= (double)NUM_REPEATS;
value[index] = mean;
free(d_array);
}
}
这是我的&#34;模拟&#34;类。
class simulation
{
public:
simulation(uint64_t nc, std::mt19937_64 *mt19937_64_pointer, double r1_input)
: dis_p{new std::uniform_real_distribution<double>(0.0, 1.0)}
{
gen_p = mt19937_64_pointer;
m_r1 = r1_input;
cl default;
v.reserve(nc);
for(uint64_t ix = 0; ix < nc; ++ ix)
v.push_back(default);
}
~simulation()
{
delete dis_p;
}
void run(uint64_t num_steps)
{
// Algorithm code (Omitted)
}
bool get()
{
// Algorithm code (Omitted)
}
private:
std::vector<cell> v;
std::mt19937_64 *gen_p;
std::uniform_real_distribution<double> *dis_p;
double m_r1;
};
如果您发现不一致,请添加评论,然后我会修复它。
这是一个非常普遍的问题 - 我确定经常会遇到此错误消息。我当然用谷歌搜索了它,但没有找到很多有用的信息。