gpt4 book ai didi

cuda - 为什么我的 __device__、__constant__、__shared__ 不支持动态初始化?

转载 作者:行者123 更新时间:2023-12-04 22:30:47 24 4
gpt4 key购买 nike

我不明白为什么我会收到错误 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;
}

参数.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

最佳答案

您的 Params struct 用于 __constant__ cparams 的内存定义.

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

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

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

public:
__host__ __device__ Vec2(){ }; // change this line
T x, y;

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

并且,在 wrapper.cu(可能在 wrapperFunction 中)中,初始化您的 Params __constant__结构:
Params hparams;
hparams.a.x = 0.0;
hparams.a.y = 0.0;
cudaMemcpyToSymbol(cparams, &hparams, sizeof(Params));

关于cuda - 为什么我的 __device__、__constant__、__shared__ 不支持动态初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27041820/

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