我不明白为什么在编译代码时出现错误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
答案 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)
我遇到了和你一样的问题,我找到了两种方法来解决它。
用C-type定义你的结构,如下所示:
typedef struct {} ClassName;
将构造函数和析构函数定义为__device__类型,如下所示:
struct ClassName{
public:
__device__ ClassName(){...}
__device__ ~ClassName(){...}
};