CUDA 矩阵加法时序,按行与按行比较按栏目

2024-05-04

我目前正在学习 CUDA,并正在做一些练习。其中之一是实现以 3 种不同方式添加矩阵的内核:每个元素 1 个线程、每行 1 个线程和每列 1 个线程。矩阵是方阵,并被实现为一维向量,我只需用以下命令对其进行索引

A[N*row + col]

直觉上,由于线程开销,我预计第一个选项是最慢的,第二个选项是最快的,因为单个线程将处理相邻的数据。

在 CPU 上,使用 8000 x 8000 的密集矩阵,我得到:

Adding on CPU - Adding down columns
Compute Time Taken: 2.21e+00 s
Adding on CPU - Adding across rows
Compute Time Taken: 2.52e-01 s

由于更多的缓存命中,速度大约提高了一个数量级。在具有相同矩阵的 GPU 上,我得到:

Adding one element per thread 
Compute Time Taken: 7.42e-05 s
Adding one row per thread 
Compute Time Taken: 2.52e-05 s
Adding one column per thread 
Compute Time Taken: 1.57e-05 s

这对我来说不直观。最后一种情况的 30-40% 加速在大约 1000 x 1000 矩阵以上是一致的。请注意,这些时序仅是内核执行的时序,不包括主机和设备之间的数据传输。下面是我的两个内核进行比较。

__global__
void matAddKernel2(float* A, float* B, float* C, int N)
{
        int row = threadIdx.x + blockDim.x * blockIdx.x;
        if (row < N)
        {
                int j;
                for (j = 0; j < N; j++)
                {
                        C[N*row + j] = A[N*row + j] + B[N*row + j];
                }
        }
}



__global__
void matAddKernel3(float* A, float* B, float* C, int N)
{
        int col = threadIdx.x + blockDim.x * blockIdx.x;
        int j;

        if (col < N)
        {
                for (j = 0; j < N; j++)
                {
                        C[col + N*j] = A[col + N*j] + B[col + N*j];
                }
        }
}

我的问题是,为什么 GPU 线程似乎没有从处理相邻数据中受益,这将有助于它获得更多缓存命中?


GPU 线程确实受益于处理相邻数据,您缺少的是 GPU 线程不是像 CPU 线程那样的独立线程,它们在一个称为 warp 的组中工作。一个 warp 将 32 个线程组合在一起,并以类似于执行宽度 32 的 SIMD 指令的单个 CPU 线程的方式工作。

因此,实际上,每列使用一个线程的代码是最有效的,因为扭曲内的相邻线程正在访问内存中的相邻数据位置,这是访问全局内存的最有效方法。

您将在以下位置找到详细信息CUDA文档 http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#simt-architecture.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CUDA 矩阵加法时序,按行与按行比较按栏目 的相关文章

  • 无法编译cuda_ndarray.cu:libcublas.so.7.5:无法打开共享对象文件

    我正在尝试在 aws 实例中导入 theano 库以使用 GPU 我已经使用 boto 编写了一个 python 脚本来自动执行 aws 设置 该脚本本质上会从我的本地计算机对实例执行 ssh 然后启动一个 bash 脚本 其中我执行 py
  • 使用 JOIN 或 EXISTS 可以获得更好的性能吗?

    我有两个表格 机构 和 结果 我想查看机构是否有任何结果 这样我就可以排除没有结果的机构 使用 JOIN 或 EXISTS 可以获得更好的性能吗 谢谢你 Nimesh 根据语句 统计信息和数据库服务器 这可能没有什么区别 可能会生成相同的优
  • 真实文件对象比 StringIO 和 cStringIO 慢?

    StringIO其代码中有以下注释 Notes Using a real file is often faster but less convenient There s also a much faster implementation
  • 如何使带有两个for循环的python代码运行得更快(有没有一种python方法可以进行Mathematica的并行化)?

    我对 python 或任何此类编程语言完全陌生 我对 Mathematica 有一些经验 我有一个数学问题 虽然 Mathematica 用她自己的 并行化 方法解决了这个问题 但在使用所有核心后 系统却变得非常疲惫 在跑步过程中我几乎无法
  • memmove和memcpy在什么平台上可以有显着的性能差异?

    我明白那个memmove and memcpy区别在于memmove处理内存重叠情况 我检查了 libgcc 中的实现并得到了这篇文章 memcpy性能 http software intel com en us articles memc
  • SQL Server 2005存储过程性能问题

    我遇到以下问题 当从我的应用程序调用存储过程时 时不时地 例如 1000 次调用中的 1 次 需要 10 30 秒才能完成 通常 存储过程的运行时间不到一秒 这是一个相当简单的过程 只需一个选择即可将几个表连接在一起 所有表名都设置有 NO
  • 在 Java 中,对复杂模型使用接口是否会带来性能提升?

    标题很难理解 但我不知道如何以另一种方式总结 欢迎任何澄清的编辑 我被告知并建议使用接口来提高性能 即使在并不特别需要常规 接口 角色的情况下也是如此 在这种情况下 对象是大模型 MVC 意义上的 具有许多方法和字段 向我推荐的 好用处 是
  • 代表和结构的速度问题

    我遇到了一些与结构和委托有关的速度问题 采用以下控制台应用程序代码 public delegate string StringGetter public class LocalString public LocalString string
  • 在循环内部或外部声明本地更好吗? [复制]

    这个问题在这里已经有答案了 我习惯这样做 do local a for i 1 1000000 do a
  • RMI 有多快?

    我看到过这样的问题 两个独立的 Java 桌面应用程序之间的通信 https stackoverflow com questions 1680898 communication between two separate java deskt
  • 完全禁用 NVCC 优化

    我正在尝试测量 GPU 上的峰值单精度触发器 为此我正在修改 PTX 文件以在寄存器上执行连续的 MAD 指令 不幸的是 编译器正在删除所有代码 因为它实际上没有做任何有用的事情 因为我没有执行任何数据的加载 存储 是否有编译器标志或编译指
  • ElasticSearch 匹配多个前缀术语

    我试图为 ElasticSearch 提供一个包含多个术语的查询 然后给出匹配的文档 其中指定的术语位于目标字段中的任何位置 这些术语可以是完整的单词或单词前缀 示例文档 msg 你好 我是一条短信 示例查询字符串 你好消息 你好 和 消息
  • 如何提高 Field.set 的性能(也许使用 MethodHandles)?

    我正在编写一些调用的代码Field set https docs oracle com en java javase 11 docs api java base java lang reflect Field html set java l
  • 如何从C++头文件调用CUDA文件?

    我知道从 c 文件调用 cu 文件的方法 但现在我想从 C 头文件调用 cu 文件 有可能做到吗 如果是这样 我应该如何设置我的项目 请帮忙 这是一个有效的例子 file1 h int hello file2 h include
  • STL 容器速度与数组

    我刚刚开始从事一个科学项目 其中速度非常重要 HPC 我目前正在设计数据结构 该项目的核心是双值 3D 网格 以求解偏微分方程 由于这里的速度可能比代码的简单性更重要 我想知道 STL 与通常的 C 风格数组相比如何执行 就我而言 因为它是
  • CUDA 中的 JPEG 库

    我正在尝试在 CUDA 中压缩和解压缩图像 到目前为止我已经找到了这个库 http sourceforge net projects cuj2k source navbar http sourceforge net projects cuj
  • 使用map.get()时使用java Map.containsKey()是多余的

    一段时间以来 我一直想知道在最佳实践中是否允许避免使用containsKey 方法上java util Map而是对结果进行空检查get 我的理由是 两次查找值似乎是多余的 首先是查找containsKey 然后再次为get 另一方面 大多
  • 空 while 循环有什么影响?

    我知道这可能是一个有点 愚蠢 的问题 但有时 我只想循环直到条件为假 但我不喜欢让循环保持为空 所以代替 Visible true while IsRunning Visible false 我通常prefer while IsRunnin
  • 为什么使用 boost::none 无法通过 nvcc 编译?

    我正在尝试编译以下代码 include
  • 如何转储所有 NVCC 预处理器定义?

    我想达到同样的效果 gcc dM E lt dev null 如所描述的here https stackoverflow com q 2224334 1593077 但对于 nvcc 也就是说 我想转储所有 nvcc 的预处理器定义 唉 n

随机推荐