- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我没有向内核传递大量参数,而是使用了一个 __constant__
变量。这个变量是一个结构数组,其中包含许多指向全局数据的指针(这些指针将是一个参数列表);用于调用内核的多个不同数据集的数组。然后内核访问这个数组并取消对全局适当数据的引用。我的问题是,这些数据是通过 L2 缓存还是通过常量缓存缓存?此外,如果后者通过 __ldg()
加载,它会通过 L1 还是仍然是常量缓存?
更具体地说,数据本身位于全局中,但是内核取消引用 __constant__
变量来访问它。这会对缓存产生不利影响吗?
最佳答案
由立即常量(操作码中的常量)或索引常量(通过ldc
指令访问)访问的常量变量通过(bank,offset)对访问,而不是通过地址访问。这些读取通过立即常量和索引常量缓存。在某些芯片上,这些是相同的缓存。常量访问的例子是:
// immediate constant
ADD r0, r1, c[bank][offset]
// r1 has packed version of bank, offset
LDC r0, r1
传递 cc2.0 及更高版本的参数,这样您将看到立即的常量访问。
常量访问通过常量内存层次结构,最终产生一个全局地址,该地址可以在系统内存或设备内存中。
如果您将常量变量设置为指向全局的指针,则数据将通过数据层次结构读取。
如果您定义一个 const 变量,编译器可以选择将只读数据放入存储区/偏移量或地址中。
如果您查看 SASS(nvdisasm 或工具),您将看到 LD
说明。根据芯片的不同,此数据可能先缓存在 L1/Tex 缓存中,然后缓存在 L2 缓存中。
SHARED
LDS/STS/ATOMS -> shared memory
GENERIC
LD/ST (generic to shared) -> shared memory
LD/ST (generic to global) -> L1/TEX -> L2
LD/ST (generic to local) -> L1/TEX -> L2
LOCAL
LDL/STL (local) -> L1/TEX -> L2
GLOBAL
LDG/STG (global) -> TEX -> L2
INDEXED CONSTANT
LDC -> indexed constant cache -> ...-> L2
L2 未命中可以转到设备内存或固定系统内存。
在您提到常量变量的情况下,很可能会通过立即常量访问(最佳性能假设常量大小合理)并且取消引用的指针将导致全局内存访问。
在 GK110 上,LDG
指令缓存在纹理缓存中。
Maxwell LDG.CI
指令缓存在纹理缓存中。 LDG.CA
操作缓存在纹理缓存 (GM20x) 中。所有其他 LDG
访问都通过纹理缓存,但在 warp 指令的生命周期之后不会被缓存。
关于CUDA __constant__ 对全局内存的尊重。哪个缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34170310/
有什么区别,在 CUDA 程序中定义设备常量的最佳方法是什么?在 C++,主机/设备程序中,如果我想将常量定义在设备常量内存中,我可以这样做 __device__ __constant__ float
我没有向内核传递大量参数,而是使用了一个 __constant__ 变量。这个变量是一个结构数组,其中包含许多指向全局数据的指针(这些指针将是一个参数列表);用于调用内核的多个不同数据集的数组。然后内
我在 C# 中使用 ManagedCuda,但我有一个问题找不到答案...也许您可以帮助我。我读到在 C++ 和 CUDA 中你可以声明一个变量(它是一个数组),比如: __constant__ do
我在 C# 中使用 ManagedCuda,但我有一个问题找不到答案...也许您可以帮助我。我读到在 C++ 和 CUDA 中你可以声明一个变量(它是一个数组),比如: __constant__ do
我是 CUDA 编程新手。目前,我正在尝试构建一个使用 CUDA 并行处理数据的 OO 框架。我目前正在使用 CUDA 8.0。 有一些关键参数__constant__ int foo[3]需要所有线
我有一个数组,我想在 CUDA 设备上的 __constant__ 内存中初始化。直到运行时我才知道它的大小或值。 我知道我可以使用 __constant__ float Points[**N**][
我不明白为什么我会收到错误 dynamic initialization is not supported for __device__, __constant__, __shared__ varia
我对 CUDA 有点陌生,所以如果这是一个愚蠢的问题,请原谅我。我一直在阅读/观看很多教程,但它们都很困惑,但我认为我已经掌握了基本概念。无论如何,我正在尝试执行以下操作:我想在设备上初始化几个常量变
例如,如果您有一个简单的常量变量 __device__ __constant__ int MY_CONSTANT; 并且它被同一个内核线程多次访问: __global__ void move(int*
我在同一个问题上看到了很多答案,但从未找到解决方案。只有一些建议在 cudaMemcpyToSymbol(...) 等中使用 char simbol。 我使用来自 cudaMemcpyToSymbol
与 CUDA 一样,最基本的东西有时也是最难的…… 所以...我只想将一个变量从 CPU 复制到 GPU 的 常数 变量,我很难过。 这就是我所拥有的: __constant__ int contad
我正在尝试编译一个 CUDA 示例; cuda.cu: __constant__ unsigned VERTICES; __constant__ unsigned TRIANGLES; 以及main.
在共享内存编程模型中,任何全局变量对每个线程都是可见的。 在 CUDA 中,常量 内存的声明方式与共享内存系统中的全局变量类似,这让我有点担心: 考虑以下代码: __constant__ int ar
我正在尝试静态初始化 GPU 内存中的只读 std::map 变量,如下所示: // EXAMPLE 1: using namespace std; // first attempt: __devic
我是一名优秀的程序员,十分优秀!