- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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;
}
__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? */
_holdrand
在这个例子中可以在两个不同的函数中修改?
最佳答案
简而言之 - OpenCL 程序生命周期和内存布局与 C 程序不同。在 OpenCL 中,您没有堆栈、堆等。常量内存(通常)非常快且片上内存量很少,与寄存器操作相比,IO 操作具有相同的性能顺序。因此,它可能对来自工作项的写入操作有限制。
在每个 NDRange 中(通常)都有数千个工作项 (WI)。想象一下,如果 512 个线程正在读/写同一个变量,你能达到什么性能。这就是为什么你有 4 个地址空间:
__private
对于每个 WI __local
对于工作组内的所有 WI __global
对于 NDRange 内的所有 WI __constant
用于全局只读变量 rand()
&
srand()
函数是特定于 WI 的,你应该使用私有(private)内存。另一种方法是在全局地址空间中拥有您需要的变量。但在这种情况下,要非常小心竞争条件。
关于global-variables - 为什么程序(全局)范围变量必须是 __constant?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22471466/
在我的 OpenCL 内核中,我有很多控制内存分配、循环迭代次数等的常量。使用全局 __constants 还是 #defines 更快? 最佳答案 与“普通”C 编译器相同的规则适用于 OpenCL
在我的 OpenCL 内核中,我有很多控制内存分配、循环迭代次数等的常量。使用全局 __constants 还是 #defines 更快? 最佳答案 与“普通”C 编译器相同的规则适用于 OpenCL
我想了解当我创建一个具有只读属性的缓冲区并将其与 __constant 一起使用时有什么区别内核中的地址空间限定符或与 const __global 一起使用地址空间限定符。 我已经发现这些并不是我问
我是 OpenCL 的新手,对这个限制感到非常困惑。例如,如果我想写一个 LCG,我必须使状态字可以修改为 rand()。和 srand() .在 ANSI C 中,我会这样做: /* ANSI C
据我所知。 CUDA 上的常量内存是一种特定的内存。而且它比全局内存更快。但在 OpenCL 的规范中。我得到以下的话。 The __constant or constant address spac
我是一名优秀的程序员,十分优秀!