- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试学习 OpenCL,但我很难决定使用哪些地址空间,因为我只发现组装资源声明了这些地址空间是什么,而不是为什么它们存在或何时使用它们。资源至少太分散了,所以我希望通过这个问题来收集所有这些信息:所有的地址空间是什么,它们为什么存在,何时使用哪个地址空间以及在内存和性能方面的优缺点是什么。
据我了解(这可能过于简化),GPU 有两种物理类型的内存:全局内存,远离实际处理器,速度慢但相当大,可供所有工作人员使用,以及本地内存,接近实际处理器,速度如此之快,但体积很小,其他工作人员无法访问。
直观地说,local
限定符确保变量放置在本地内存中,global
qualifier 确保将变量放置在全局内存中,尽管我不确定这正是发生的情况。这留下了private
和 constant
限定词。那些目的是什么?
还有一些隐含的限定符。例如,the specifications提到通用地址空间,我认为它用于没有限定符的参数。这到底是做什么的?然后还有局部函数变量。这些地址空间是什么?
这是一个使用我的直觉的例子,但不知道我实际上在做什么:
示例:
假设我传递了一个 long
类型的数组并且长度为 10000 到一个我只会用来读取的内核,然后我会声明它 global const
因为它必须可供所有 worker 使用,并且不会改变。为什么我不使用 constant
预选赛?通过 CPU 为这个数组设置缓冲区时,我实际上也可以将数组设为只读,在我看来这与声明它 const
相同。 .再说一次,我何时以及为什么要声明 constant
或 global const
?
在执行内存密集型任务时,将数组复制到内核内部的本地数组会更好吗?我的猜测是本地内存太小了,但是如果数组只有 10 的长度呢?数组什么时候会太大/太小?更笼统地说:什么时候值得将数据从全局内存复制到本地内存?
假设我也想传递这个数组的长度,那么我会添加 const int length
我的内核的论点,但我不确定为什么我会省略 global
限定词除非因为我看到其他人这样做。毕竟,length
必须可供所有 worker 使用。如果我是对的,那么 length
会有一个通用的地址空间,但同样,我真的不知道这意味着什么。
我希望有经验的人可以解决这个问题。这不仅对我来说很棒,而且我也希望对其他想要获得有关 GPU 内存管理的实用知识的爱好者也有帮助。
最佳答案
常数:所有工作人员都可以看到一小部分缓存的全局内存。如果可以,请使用它,只读。
全局:慢,所有人都能看到,读或写。它是您所有数据的终点,因此始终需要对其进行一些访问。
本地:您需要在本地群组中分享内容吗?使用本地!您的所有本地工作人员是否都访问相同的全局内存?使用本地!
本地内存仅在本地工作人员内部可见,并且大小有限,但速度非常快。
私有(private):仅对工作人员可见的内存,将其视为寄存器。默认情况下,所有未定义的值都是私有(private)的。
Say I pass an array of type long and length 10000 to a kernel which I will only use to read, then I would declare it global const as it must be available to all workers and it will not change. Why wouldn't I use the constant qualifier?
constant
限定符。它将您的数据放在常量内存上(所有工作人员可以快速访问的一小部分只读内存)。 GPU 使用它来将制服传输到所有顶点着色器。
When setting the buffer for this array via the CPU, I actually also just could have made the array read-only, which in my eyes says the same as declaring it const. So again, when and why would I declare something constant or global const?
global const
只是对开发者的一种保障,所以你不要不小心写到它,它会在编译时出错。
When performing memory-intensive tasks, would it be better to copy the array to a local array inside the kernel? My guess is that local memory would be too small, but what if the array only had a length of 10? When would the array be too big/small? More general: when is it worth copying data from global to local memory?
Worker0 -> Reads 0,1,2,3
Worker1 -> Reads 0,1,2,3
Worker2 -> Reads 0,1,2,3
Worker3 -> Reads 0,1,2,3
Worker0 -> Reads 0
Worker1 -> Reads 1
Worker2 -> Reads 2
Worker3 -> Reads 3
Say I also want to pass the length of this array, then I would add const int length to the arguments of my kernel, but I'm unsure why I would omit the global qualifier except because I have seen other people do it. After all, length must be accessible for all workers. If I'm right, then length would have a generic address space, but again, I don't really know what that means.
constant
,这就是你想要的那些小元素,让所有工作人员都能快速访问。
关于memory - OpenCL 何时使用全局、私有(private)、本地、常量地址空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45426212/
据我所知,在 C# 中,所有字段默认都是私有(private)的,如果没有另外标记的话。 class Foo { private string bar; } class Foo { strin
这个问题在这里已经有了答案: Why is it allowed to access Java private fields via reflection? (7 个答案) 关闭 6 年前。 使用反
在 C#(和许多其他语言)中,访问相同类型的其他实例的私有(private)字段是完全合法的。例如: public class Foo { private bool aBool; pu
使用私有(private)方法通过将一些决策点重构为单独的方法来降低 CC 会降低实际方法的 CC 并易于阅读,但不会减少在测试中获得完整分支覆盖的工作量。 这合理吗?你有什么现场经验? 最佳答案 好
在下面的例子中,模块outer有一个私有(private)类型Private和一个私有(private)内部模块inner。 inner 能够访问Private(因为子模块可以访问其父级的私有(pri
class Person def one @var = 99 self.two end private def two p @var end end p=P
我在 Azure 中创建了 VNET。我放入了一个子集 Azure Private Link,它在 VNET 之外和另一台虚拟机中调用 Azure Function。 当我尝试通过专用 IP 调用专用
我在 Azure 中创建了 VNET。我放入了一个子集 Azure Private Link,它在 VNET 之外和另一台虚拟机中调用 Azure Function。 当我尝试通过专用 IP 调用专用
我正在尝试获得良好的 Ruby 编码风格。为防止意外调用具有相同名称的局部变量,我总是在适当的地方使用 self.。但是现在我偶然发现了这个: class MyClass "method" a
今天遇到一个案例类构造函数的奇怪问题。我想将构造函数设为私有(private),看来这不是问题。所以我已经在我的一个项目中尝试过它并且它有效。但在另一个项目中,我可以调用私有(private)构造函数
我想坚持使用记录,并且不想返回对象。所以我想知道是否可以将记录的字段设置为私有(private)?或者创建记录的私有(private)成员。其他具体类型(例如可区分联合)怎么样? 或者,这个要求是否违
我正在通过 Flickr API 进行经过身份验证的调用来访问照片。但我只得到我的公开照片,而没有任何私有(private)照片。 下面给出的是我正在使用的代码, Flickr f; Request
这两个类的行为不同;原因似乎与使用 private[this] 声明而不是 private 有关。有人可以解释一下为什么吗? 私有(private): class Person( private
在 private 中的 1000 秒 private 之后,我想到可能不需要它 public class Outer { private static class Inner { // yo
我有以下代码: class C { private enum E { // ... } } private extension C { func f(e: E)
OOP 语言中是否有object-private 的概念??我的意思是比经典的私有(private)访问限制更多? Private (or class-private) restricts the a
swift 3.0 我知道fileprivate访问级别修饰符将函数/属性的使用限制在声明它的源文件和 private - 仅限于声明的词法范围。但似乎这条规则不适用于扩展。例如。此代码有效: cla
即将推出的 Delphi 版本中启用该功能的功能怎么样? 也许它可能是一个编译器开关,促进所有 ** private **s to ** strict private **小号。 ... 或者它可能是
我可以通过将函数放入类的私有(private)扩展中来创建私有(private)函数,而不是通过不断调用 private func functionName(){} 来创建新的私有(private)函
部署专用端点并需要专用 IP 地址作为输出,但似乎无法正确获取值查询。下面的结果是“模板输出'主机名'无效:语言表达式属性|'privateIPAddress'具有无效的数组索引..(代码:Deplo
我是一名优秀的程序员,十分优秀!