问题标签 [gpu-shared-memory]
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.
gpu - GPU 共享内存非常小 - 我该怎么办?
在当今大多数 nVIDIA GPU 上,共享内存(OpenCL 术语中的“本地内存”)的大小仅为 16 KiB。
我有一个应用程序,我需要在其中创建一个包含 10,000 个整数的数组。所以我需要容纳 10,000 个整数 = 10,000 * 4b = 40kb 的内存量。
- 我该如何解决这个问题?
- 是否有任何 GPU 具有超过 16 KiB 的共享内存?
opencl - OpenCL 本地内存有限制吗?
今天__local
,我在内核中添加了四个变量来转储中间结果。但是,只需将这四个变量添加到内核的签名中并添加相应的内核参数,内核的所有输出就会变为“0”。没有一个 cl 函数返回错误代码。
我进一步尝试只添加两个较小的变量之一。如果我只添加其中一个,它可以工作,但如果我同时添加它们,它就会崩溃。
那么 OpenCL 的这种行为是否意味着我分配了很多__local
内存?我如何知道我可以使用多少__local
内存?
c++ - 分配共享内存
我正在尝试使用常量参数分配共享内存,但出现错误。我的内核看起来像这样:
我收到一个错误消息
错误:表达式必须有一个常量值
计数是常量!为什么我会收到此错误?我怎样才能解决这个问题?
c - 本地内存是否比 CUDA 中的共享内存慢?
我只发现本地内存比寄存器内存慢的说法,即每线程两个类型。
共享内存应该是快的,但它比本地内存(线程的)快吗?
我想做的是一种中值过滤器,但使用给定的百分位数而不是中值。因此,我需要获取列表中的大部分内容,对它们进行排序,然后选择一个合适的。但我无法开始对共享内存列表进行排序,否则会出错。仅复制到本地内存会损失很多性能吗?
cuda - CUDA:共享内存上的原子操作
我的 cuda 内核会在块执行结束时生成一些馈送到主机的内容。
骨架如下。
写入数据的 host_data 被分配为主机映射内存。
host_data_count 也是映射内存,表示产生的数据数量。
我使用的 GPU 是带有 Fermi 架构和 CC 2.0 的 GTX 580。
我在这个内核代码中缺少什么?
有人可以帮忙吗?
cuda - 在 CUDA 中使用共享和常量内存
我想读取一个文本文件并将其存储在一个数组中。然后,我想将数组从主机传输到设备并将其存储在共享内存中。我编写了以下代码,但与使用全局内存相比,执行时间有所增加。我无法理解原因可能是什么?此外,如果有人可以帮助我使用常量内存编写这段代码,那就太好了。
cuda - 如何定义运行时已知大小的 CUDA 共享内存?
CUDA 中的__shared__
内存似乎在编译时需要一个已知的大小。但是,在我的问题中,__shared__
内存大小仅在运行时知道,即
这将以"error: constant value is not known"告终,我不知道如何解决这个问题。
cuda - 具有 100% MP 负载的 CUDA 中的最大值(每块共享内存)/(每块线程)
我正在尝试使用 CUDA 2.0 (NVIDIA 590) 处理大型结构数组。我想为此使用共享内存。我已经尝试使用 CUDA 占用计算器,尝试为每个线程分配最大共享内存,以便每个线程可以处理数组的整个元素。然而,我在计算器中看到的(每块共享内存)/(每块线程)的最大值为 32 字节,100% 多处理器负载是 32 字节,这对于单个元素(数量级)来说是不够的。32 字节是(每块共享内存)/(每块线程)的最大可能值吗?是否可以说哪个alternative4native更可取-在全局内存中分配部分数组还是仅使用负载不足的多处理器?还是只能通过实验来决定?我可以看到的另一种选择是多次处理数组,但它看起来像是最后的手段。
cuda - 从共享内存中读取 int 数组是否会排除银行冲突?
我正在设计一个 CUDA 内核,每个线程块将启动 16 个线程。我希望处理的共享内存(即每个线程块)中有一个 N 个整数数组。
如果线程的访问模式在数组中是连续的,那么这是否意味着不会有银行冲突?我知道如果数组是 char 数组,则会发生银行冲突,但我不完全确定如果它是 int 数组会发生什么。我猜会有银行冲突,因为每组 4 个连续的整数共享同一个内存库?
如果这是真的,那么防止银行冲突的正确解决方案是什么?直方图样本中的地址加扰?
cuda - 本地、全局、常量和共享内存
我阅读了一些引用本地内存的 CUDA 文档。(主要是早期文档。)设备属性报告本地内存大小(每个线程)。“本地”内存是什么意思?什么是“本地”内存?“本地”内存在哪里?如何访问“本地”内存?是__device__
记忆,不是吗?
设备属性还报告:全局、共享和恒定的内存大小。这些陈述是否正确:
全局内存就是__device__
内存。它具有网格范围和网格(内核)的生命周期。
不变的记忆就是__device__ __constant__
记忆。它具有网格范围和网格(内核)的生命周期。
共享内存就是__device__ __shared__
内存。它具有单个块范围和该块(线程)的生命周期。
我认为共享内存是 SM 内存。即只有那个单一的SM可以直接访问的内存。相当有限的资源。SM不是一次分配一堆块吗?这是否意味着 SM 可以交错执行不同的块(或不能)?即运行块* A * 线程,直到它们停止。然后运行 block* B * 线程直到它们停止。然后再换回 block* A * 线程。或 SM 是否为 block* A * 运行一组线程,直到它们停止。然后换入另一组块* A * 线程。此交换继续进行,直到块* A * 用尽。然后才开始在块* B上工作*。我问是因为共享内存。如果单个 SM 正在从 2 个不同的块交换代码,那么 SM 如何快速换入/换出共享内存块?(我认为后面的 senerio 是真的,并且没有换入/换出共享内存空间。块 * A * 运行直到完成,然后块 * B * 开始执行。注意:块 * A * 可能是不同的内核比块* B *。)