问题标签 [coalescing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - How to write a proper null-safe coalescing operator in scala?
Having seen the answers coming out of questions like this one involving horror shows like trying to catch the NPE and dredge the mangled name out of the stack trace, I am asking this question so I can answer it.
Comments or further improvements welcome.
iphone - 使用 NSNotificationQueue 时合并
我编写了以下代码来使用 NSNotificationQueue 执行合并。即使事件发生多次,我也只想发布一个通知。
每次调用“test000AsyncTesting”方法时,同名的通知都会被添加到队列中。根据合并的概念,如果队列有任意数量的通知但名称相同,则它只会发布一次。但是当我运行我的代码时,'async000:' 被多次调用,这与添加到 NSNotificationQueue 的通知数量完全相同。我认为合并不起作用。
对我来说,在这两种情况下,代码的执行都是一样的:
案例1:[[NSNotificationQueue defaultQueue] enqueueNotification:[NSNotification notificationWithName:@"async000" object:self] 张贴风格:NSPostWhenIdle coalesceMask:NSNotificationCoalescingOnName forModes:nil];
案例2:[[NSNotificationQueue defaultQueue] enqueueNotification: [NSNotification notificationWithName:@"async000" object:self] postingStyle:NSPostWhenIdle];
请告诉我代码中的错误。
memory - CUDA: memory transaction size for compute capability 1.2 or later
all, From "NVIDIA CUDA Programming Guide 2.0" Section 5.1.2.1: "Coalescing on Devices with Compute Capability 1.2 and Higher"
"Find the memory segment that contains the address requested by the lowest numbered active thread. Segment size is 32 bytes for 8-bit data, 64 bytes for 16-bit data, 128 bytes for 32-, 64- and 128-bit data."
I have a doubt here: since each half-warp has 16 threads, if all threads access 8-bit data, then the total size for per half-warp should be 16 * 8-bit=128 bits= 16 bytes. While "Guide" says "32 bytes for 8-bit data". It seems half bandwidth is wasted. Am I understanding correctly?
Thanks Deryk
cuda - CUDA 编程 - L1 和 L2 缓存
您能否解释在 CUDA 编程中同时使用“L1 和 L2”缓存或“仅 L2”缓存之间的区别?在时间执行中我应该期待什么?我什么时候可以期待更小的 GPU 时间?当我同时启用 L1 和 L2 缓存或仅启用 L2 时?谢谢
memory - CUDA 合并访问全局内存
我已经阅读了 CUDA 编程指南,但我错过了一件事。假设我在全局内存中有 32 位 int 数组,我想通过合并访问将它复制到共享内存。全局数组的索引从 0 到 1024,假设我有 4 个块,每个块有 256 个线程。
何时执行合并访问?
1.
全局内存中的地址从 0 复制到 255,每个被 32 个线程在 warp 中复制,所以可以吗?
2.
如果 someIndex 不是 32 的倍数,它不会合并?地址错位?那是对的吗?
cuda - GPGPU - CUDA:全球存储效率
我正在尝试根据 NVidia 分析器的“全局存储效率”值(我在 Fermi GPU 上使用 CUDA 5 工具包预览版)来确定我的一个内核的全局内存写入访问的合并程度。
据我了解,该值是请求的内存事务与实际执行的事务 nb 的比率,因此反映了访问是否全部完美合并(100% 效率)。
现在,对于 32 的线程块宽度,并将浮点值作为输入和输出,以下测试内核为全局加载和全局存储提供了 100% 的效率,正如预期的那样:
我不明白为什么当我开始在输入读取和输出写入之间添加有用的代码时,全局存储效率开始下降,而我没有改变内存写入模式或线程块几何?不过,正如我所料,全球负载保持在 100%。
有人可以解释一下为什么会发生这种情况吗?我想,由于给定 warp 中的所有 32 个线程同时执行输出存储指令(根据定义)并使用“合并友好”模式,我仍然应该得到 100% 之前所做的任何事情,但显然我一定是误解了一些事情要么是全局存储效率的含义,要么是全局存储合并的条件。
谢谢,
编辑 :
这是一个例子:如果我使用这段代码(只是在输入上添加一个“round”操作),全局存储效率从 100% 下降到 95%
c++ - CUDA 中什么更快:全局内存写入 + __threadfence() 或 atomicExch() 到全局内存?
假设我们有很多线程将顺序访问全局内存,那么总体上哪个选项执行得更快?我很怀疑,因为 __threadfence() 考虑了所有共享和全局内存写入,但写入是合并的。另一方面, atomicExch() 仅考虑重要的内存地址,但我不知道写入是否合并。
在代码中:
或者
谢谢。
memory - HLSL:内存与结构化缓冲区的合并
我目前正在研究受全局内存带宽限制的 HLSL 着色器。我需要在每个内存事务中合并尽可能多的内存。根据 NVIDIA 对 CUDA 和 OpenCL 的指导(DirectCompute 文档非常缺乏),计算能力 2.0 的最大内存事务大小为 128 字节,而可访问的最大字为 16 字节。当 warp 中的线程访问的数据落入相同的 128 字节段时,可以合并全局内存访问。考虑到这一点,如果结构大于 16 字节,结构化缓冲区不会对内存合并有害吗?
假设您有两个 float4 的结构,分别称为 A 和 B。您可以访问 A 或 B,但不能在单个内存事务中同时访问在非发散扭曲中发出的指令。内存的布局看起来像 ABABABAB。如果您尝试将连续结构读入共享内存,以这种方式存储数据不会浪费内存带宽吗?例如,您只能访问 A 元素,但硬件会合并内存事务,因此它会读取 128 字节的连续数据,其中一半是 B 元素。从本质上讲,您浪费了一半的内存带宽。像 AAAABBBB 这样存储数据不是更好吗,它是缓冲区结构而不是结构缓冲区?或者这是由 L1 缓存处理的,B 元素被缓存在哪里,以便在下一条指令读取 B 元素时可以更快地访问它们?唯一的其他解决方案是让偶数线程访问 A 元素,而奇数线程访问 B 元素。
如果确实浪费了内存带宽,我不明白为什么有人会使用结构化缓冲区而不是为了方便。希望我解释得足够好,以便有人能理解。我会在 NVIDIA 开发者论坛上问这个问题,但我认为他们仍然失败。当我尝试运行 NVIDIA Nsight 帧分析器时,Visual Studio 不断崩溃,因此很难看出内存带宽如何受到数据存储方式变化的影响。PS,有没有人能够成功运行 NVIDIA Nsight 帧分析器?
c# - 十进制和十进制的空合并运算符
我在应用空合并运算符时遇到以下错误。
返回以下错误:
操作员 '??' 不能应用于“十进制”和“十进制”类型的操作数
为什么这不起作用?空合并运算符是否不适用于小数,或者我在这里遗漏了什么?我知道如何在不使用运算符的情况下解决此问题,但这让我有些困惑,所以我想知道您是否知道正确答案?
谢谢!
memory - Cuda - 选择性内存存储
在我的内核中,如果满足条件,我会更新输出缓冲区的一项
否则输出可能保持不变,值为 0。
更新的密度非常不可预测,具体取决于输入。此外,哪个输出位置将被更新也是未知的。(在某些情况下,我可能会强迫他们)
我的问题是,写所有项目、实现合并还是选择性写更好?
你介意讨论你的陈述吗?