为什么我得到__device __,__ conststant __,__ shared__不支持动态初始化?

时间:2014-11-20 14:19:32

标签: cuda cmake

我不明白为什么在编译代码时出现错误dynamic initialization is not supported for __device__, __constant__, __shared__ variables。 我的代码看起来像

wrapper.cu

#include "../Params.hpp"

__constant__ Params cparams;

void wrapperFunction(uint& a)
{
   Params ab;
   a = 20;
}

Params.hpp

#include "Utils.hpp"

typedef struct Params
{
   vectorTypef a;
} Params;

Utils.hpp

#include "Vec2.hpp"

typedef unsigned int uint;
typedef Vec2<float> vectorTypef;

Vec2.hpp

template <typename T>
class Vec2
{
public:
   Vec2(){ x = 0.0; y = 0.0;}
   T x, y;
};

使用命令

使用cmake构建

CUDA_ADD_EXECUTABLE(test main.cpp cudasrc/wrapper.cu

2 个答案:

答案 0 :(得分:10)

您的Params结构用于__constant__的{​​{1}}内存定义。

您的cparams结构包含Params类型的a元素,它是vectorTypef Vec2类的typedef。这个类有一个默认的构造函数,它最终分配float结构的元素。这种将数据分配到Params区域的方法在设备代码或主机代码中都不合法。

在设备代码中,完全修改__constant__值是不合法的。在主机代码中(这里是视图中的内容),应使用适当的API(即__constant__)分配__constant__值。我建议您明确地在主机代码中分配这些,而不是通过构造函数。

因此,解决此问题的一种可能方法是将默认构造函数更改为空构造函数:

cudaMemcpyToSymbol

(你也可以删除空的默认构造函数行)

并且,在wrapper.cu中(可能在public: __host__ __device__ Vec2(){ }; // change this line T x, y; 中),初始化您的wrapperFunction Params结构:

__constant__

答案 1 :(得分:0)

我遇到了和你一样的问题,我找到了两种方法来解决它。

  1. 用C-type定义你的结构,如下所示:

    typedef struct {} ClassName;
    
  2. 将构造函数和析构函数定义为__device__类型,如下所示:

    struct ClassName{
    public:
        __device__ ClassName(){...}
        __device__ ~ClassName(){...}
    };