gpt4 book ai didi

global-variables - 为什么程序(全局)范围变量必须是 __constant?

转载 作者:行者123 更新时间:2023-12-04 08:32:25 24 4
gpt4 key购买 nike

我是 OpenCL 的新手,对这个限制感到非常困惑。例如,如果我想写一个 LCG,我必须使状态字可以修改为 rand()。和 srand() .在 ANSI C 中,我会这样做:

/* ANSI C */
static unsigned long _holdrand = 1; /* Global! */

unsigned long rand(){
_holdrand = _holdrand * 214013L + 2531011L;
return (_holdrand >> 16) & 0x7FFF;
}
void srand( unsigned long seed ){
_holdrand = seed;
}

但是 OpenCL 将所有全局范围变量限制为 __constant .我可以移动 _holdrand进入函数范围,并将它的指针返回到该函数之外。
/* OpenCL C */
uint* holdrand(){
__private static uint _holdrand = 1;
return &_holdrand;
}

uint rand(){
*holdrand() = *holdrand() * 214013L + 2531011L;
return (*holdrand() >> 16) & 0x7FFF;
}
void srand( uint seed ){
*holdrand() = seed;
}

它工作正常,我不知道这是否是一个好的解决方案。这个限制是无稽之谈,我只是通过添加更多奇怪的代码来避免它。
__private uint _holdrand = 1;
/* It should be the same thing... Why this is not allowed? */

由于 return-a-pointer-of-static 方式的行为与 ANSI C 中的全局范围变量方法完全相同,我无法理解限制的含义。有人可以解释为什么吗?我错过了什么吗?我该怎么做 _holdrand在这个例子中可以在两个不同的函数中修改?

最佳答案

简而言之 - OpenCL 程序生命周期和内存布局与 C 程序不同。在 OpenCL 中,您没有堆栈、堆等。常量内存(通常)非常快且片上内存量很少,与寄存器操作相比,IO 操作具有相同的性能顺序。因此,它可能对来自工作项的写入操作有限制。

在每个 NDRange 中(通常)都有数千个工作项 (WI)。想象一下,如果 512 个线程正在读/写同一个变量,你能达到什么性能。这就是为什么你有 4 个地址空间:

  • __private对于每个 WI
  • __local对于工作组内的所有 WI
  • __global对于 NDRange 内的所有 WI
  • __constant用于全局只读变量

  • 如果您的 rand() & srand()函数是特定于 WI 的,你应该使用私有(private)内存。另一种方法是在全局地址空间中拥有您需要的变量。但在这种情况下,要非常小心竞争条件。

    OpenCL 可以在各种各样的设备上运行,这就是为什么有些限制看起来太严格了。

    关于global-variables - 为什么程序(全局)范围变量必须是 __constant?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22471466/

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