【发布时间】:2018-09-15 11:21:38
【问题描述】:
我正在尝试静态初始化 GPU 内存中的只读 std::map 变量,如下所示:
// EXAMPLE 1:
using namespace std;
// first attempt: __device__ extern const
__device__ extern const map<char, const char*> BYTES_TO_WORDS = {
{0xB0, "zero"}, {0xB1, "one"}, {0xB2, "two"}, {0xB3, "three"}};
// second attempt: __const__ static
enum class Color{RED, GREEN, BLUE};
enum class Device{PC, TABLET, PHONE};
__constant__ static map<Color, Device> COLORS_TO_THINGS = {
{Color::RED,Device::PC},{Color::GREEN,Device::TABLET},{Color::BLUE,Device::PHONE}};
但我收到以下错误:
dynamic initialization is not supported for __device__, __constant__ and __shared__ variables
我很困惑,因为当我尝试这样的事情时没有收到此错误:
// EXAMPLE 2:
__device__ extern int PLAIN_ARRAY[] = {1, 2, 3, 4, 5};
我只想能够创建和初始化一个只读 std::map 并从 CPU 和 GPU 代码访问它。如果您能告诉我如何正确操作,我将不胜感激。
编辑: 有人指出,设备代码不支持标准库。但我得到的错误似乎表明这是一个内存管理问题。
【问题讨论】:
-
std::map将无法从 GPU 代码中正确使用,即使您可以解决此存储问题。限制标识为here。 -
谢谢,我不知道。
-
错误很明显。
PLAIN_ARRAY和BYTES_TO_WORDS的初始化过程不一样,因为一个是静态的,另一个是动态的,并且涉及运行构造函数,这对于静态声明的设备符号是非法的
标签: c++ memory-management cuda gpu variable-initialization