CUDA:不允许从__global__函数()调用__host__函数()

时间:2015-10-08 13:36:41

标签: cuda

我编写了一个我在并行化(多[[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;

};

如果您发现不一致,请添加评论,然后我会修复它。

这是一个非常普遍的问题 - 我确定经常会遇到此错误消息。我当然用谷歌搜索了它,但没有找到很多有用的信息。

0 个答案:

没有答案