我目前正在学习如何编写快速 CUDA 内核。 I implemented a tiled matrix multiplication (block size 32x32) which only does coalesc reads/writes from/to global memory and ...
我目前正在学习如何编写快速 CUDA 内核。 I implemented a tiled matrix multiplication (block size 32x32) which only does coalesc reads/writes from/to global memory and ...
我遇到了一个性能问题,在使用nv-nsight-cu-cli进行分析后, float上的共享内存atomicAdd比int上的要贵得多。 检查生成的SASS后,发现共享内存的atomicAdd在float和int上生成的SASS根本不相似。 在这里,我展示了一个最小 cuda 代码的示例:$ ca ...
传统上,NVIDIA GPU 提供了 CUDA 线程块共享 memory 的数量始终可被 16 KiB 整除(参见例如在此表中)。 但是,对于 Ampere 8.0 和 8.6 GPU,数量为 99 KiB 和 163 KiB。 怎么来的? 这是因为硬件问题吗? 不会是错字吧? ...
我有一个数据结构hash 表,它具有线性探测 hash 方案,并设计为使用 CAS 无锁。 hash表constexpr uint64_t HASH_EMPTY = 0xffffffffffffffff; struct OnceLock { static const unsigned ...
考虑下面的程序。 它得到一个 CUDA 设备当前共享的 memory bank 大小配置; 将其设置为另一个值; 然后再次得到它。 不幸的是,这是 output: 我的问题:为什么会发生这种情况? 具体来说, 某些 CUDA GPU 是否会忽略此设置? 如果是这样,为什么设置银行配置时没有返回错误 ...
我试图了解 CUDA SDK 8.0 中的示例代码如何工作: kernel 的这一部分对我来说相当棘手。 我知道矩阵 A 和 B 表示为数组 (*float),并且由于共享 memory 块,我还知道使用共享 memory 来计算点积的概念。 我的问题是我不理解代码的开头,尤其是 3 个特定变量( ...
我搜索了解决方案并使用 pip 安装了 tensorflow-gpu。 此代码返回一个空列表。 [] 您可以看到我有 2 个 GPU,但是当我使用 keras 进行图像处理 (CNN) 时,它们都没有被使用。 我是新手,所以不明白到底出了什么问题。 请帮我配置,以便我可以使用我的 GPU 进行处理 ...
以下工作正常; 但以下不起作用: 我想了解为什么会这样? ...
我有一个简单的 CUDA 代码生成直方图的问题: 直方图用于记录输入中存在的值的数量,允许的值为 1 到 256。每个块最多有 256 个线程。 我试图将块中的总线程数限制为,以便每个线程记录直方图中出现的一个值。 如果我使用“values_arr = { 2, 2, 2, 2, 2, 2, 2, ...
我正在编写一些 N 体模拟代码,在 CUDA 中针对 Volta 和图灵系列卡进行短程交互。 我计划使用共享内存,但我不太清楚这样做时如何避免银行冲突。 由于我的交互是本地的,我计划将我的粒子数据分类到本地组中,我可以将这些数据发送到每个 SM 的共享内存(还没有担心粒子的邻居正在从另一个 SM 工 ...
这个问题是解释ptxas的详细输出的延续,第一部分 。 当我们使用ptxas -v编译内核.ptx文件,或者使用-ptxas-options=-v从.cu文件编译它时,我们得到几行输出,例如: (与链接问题中的示例相同;但名称为demangling) 这个问题涉及到最后一行。 ...
在计算能力 <= 7.2 的设备上,我总是使用 nvprof --events shared_st_bank_conflict 但是当我在带有 CUDA10 的 RTX2080ti 上运行它时,它返回 Warning: Skipping profiling on device 0 since ...
紧随主机代码test.c和设备代码test0.cu可以得出相同的结果。 test.c test0.cu 如果我编译并运行它们,它们的结果与我预期的相同。 但是,如果我在设备代码中使用共享内存而不是全局内存,如test1.cu ,则会得到不同的结果。 test1. ...
假设(CUDA 内核网格)块中的许多扭曲正在重复更新相当数量的共享内存位置。 在哪种情况下,此类工作会更快完成? : 内部warp访问局部性的情况,例如每个warp访问的内存位置总数很小,并且其中大部分确实被多个lane访问 访问anti-locality 的情况,其中所有车道通常访问不 ...
假设我在CUDA块中有完整的线程扭曲,并且这些线程中的每个线程都旨在与T类型的N个元素一起工作,它们位于共享内存中(因此,我们共有warp_size * N = 32 N个元素)。 不同的线程从不访问彼此的数据。 (好吧,他们知道,但是在以后的阶段我们不在乎)。 这种访问将在如下所示的循环 ...
我有一个像这样的数组: 我想使用G80 GPU上的共享内存来计算该数组的缩减量。 NVIDIA文档中引用的内核是这样的: 该论文的作者说,这种方法存在银行冲突的问题。 我试图理解,但我不知道为什么? 我知道银行冲突和广播访问的定义,但仍然无法理解。 银行冲突 ...
我想编写以下 CUDA 函数: 在主机端,我们有一个类似 cudaPointerGetAttributes形式的工具,它可以告诉我们一个指针是指向设备内存还是主机内存; 也许还有一些方法可以区分设备代码中的指针,也许它还可以区分共享指针和全局指针。 或者,也许更好——也许有一种编译时机制可以做到 ...
正在运行的设备端CUDA代码是否可能知道为正在运行的内核网格的每个块分配了多少(静态和/或动态)共享内存? 在主机方面,您知道启动的内核拥有(或将要拥有)多少共享内存,因为您可以自己设置该值。 但是设备方面呢? 可以很容易地将上限编译为该大小,但是该信息对于设备不可用(除非显式传递)。 ...
虽然我已经写了一段时间的CUDA内核,但我还没有使用动态并行(DP)。 我遇到了我认为可能适合的任务; 但是,我希望能够使用DP的方式是: 如果block发现需要更多线程来完成工作,则会生成它们。 它向其产生的线程赋予“所知”-本质上是其共享内存的内容, 每个产生线程的块都在其自己的 ...
我正在做一个向量减少的内核。 它基本上将向量中的所有位置相加,并将结果存储在位置0中。 我正在遵循此方案,使用512个float元素块: 编码: 奇怪的是,我期望得到银行的共同冲突,但事实并非如此。 在第一次迭代中,线程0将位置0和位置256相加,它们位于同一组中。 ...