使用 CUDA 向量类型有优势吗?

2023-12-22

CUDA 提供内置矢量数据类型,例如uint2, uint4等等。使用这些数据类型有什么优点吗?

假设我有一个由两个值 A 和 B 组成的元组。将它们存储在内存中的一种方法是分配两个数组。第一个数组存储所有 A 值,第二个数组存储与 A 值对应的索引处的所有 B 值。另一种方法是分配一个类型的数组uint2。我应该使用哪一个?推荐哪种方式?成员是否为uint3 i.e x, y, z并排存在于记忆中?


这可能有点推测性,但可能会增加@ArchaeaSoftware 的答案。

我主要熟悉计算能力2.0(Fermi)。对于这种架构,我认为使用向量化类型没有任何性能优势,除了 8 位和 16 位类型。

查看 char4 的声明:

struct __device_builtin__ __align__(4) char4
{
    signed char x, y, z, w;
};

该类型按 4 字节对齐。我不知道什么__device_builtin__做。也许它会触发编译器中的一些魔法......

声明的事情看起来有点奇怪float1, float2, float3 and float4:

struct __device_builtin__ float1
{
    float x;
};

__cuda_builtin_vector_align8(float2, float x; float y;);

struct __device_builtin__ float3
{
    float x, y, z;
};

struct __device_builtin__ __builtin_align__(16) float4
{
    float x, y, z, w;
};

float2得到某种形式的特殊待遇。float3是一个没有任何对齐的结构体float4对齐到 16 字节。我不知道该怎么办。

全局内存事务是 128 字节,对齐到 128 字节。事务总是一次执行完整的扭曲。当 warp 到达执行内存事务的函数时,例如从全局内存加载 32 位,芯片将执行为 warp 中的所有 32 个线程提供服务所需的尽可能多的事务。因此,如果所有访问的 32 位值都在单个 128 字节行内,则只需要一次事务。如果这些值来自不同的 128 字节线,则执行多个 128 字节事务。对于每个事务,当从内存中获取数据时,warp 会被搁置大约 600 个周期(除非它位于 L1 或 L2 缓存中)。

因此,我认为找出哪种类型的方法可提供最佳性能的关键是考虑哪种方法导致的 128 字节内存事务最少。

假设内置向量类型只是结构体,其中一些具有特殊的对齐方式,使用向量类型会导致值以交错方式存储在内存中(结构体数组)。所以,如果扭曲正在加载所有x该点的值,其他值(y, z, w)将由于 128 字节事务而被拉入 L1。当 warp 稍后尝试访问这些数据时,它们可能不再位于 L1 中,因此必须发出新的全局内存事务。此外,如果编译器能够发出更宽的指令来同时读取更多值,以供将来使用,它将使用寄存器来存储加载点和使用点之间的值,也许会增加寄存器的使用内核的。

另一方面,如果将值打包到数组结构中,则可以使用尽可能少的事务来服务负载。所以,当从x数组,仅x值加载到 128 字节事务中。这可能会导致事务减少、对缓存的依赖减少以及计算和内存操作之间的分布更加均匀。

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

使用 CUDA 向量类型有优势吗? 的相关文章

  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知
  • 具有 Cuda Thrust 的多个 GPU?

    如何将 Thrust 与多个 GPU 一起使用 这只是使用 cudaSetDevice deviceId 的问题吗 然后运行相关的 Thrust 代码 使用 CUDA 4 0 或更高版本 cudaSetDevice deviceId 接下来
  • 用于计算邻居列表的最佳 GPU 算法

    给定 3D 中数千个点的集合 我需要获取落在某个截止值 以欧几里得距离而言 内的每个粒子的邻居列表 并且如果可能的话 从最近到最远排序 在 CUDA 或 OpenCL 语言中 哪种 GPU 算法最快 我所知道的最快的 GPU MD 代码之一
  • C 中的 CUDA:如何使用 cudaMemcpyAsync 修复错误 11

    我目前正在尝试使用 CUDA 运行一个简单的多 GPU 程序 它的基本作用是将一个包含一些虚拟数据的大型数组复制到 GPU GPU 进行一些数学计算 然后将结果数组复制回来 我在 VS2017 的输出中没有收到任何错误 但我设置的一些错误消
  • NVCC 警告级别

    我希望 NVCC 将以下警告视为错误 warning calling a host function foo from a host device function bar NVCC 文档 NVIDIA CUDA 编译器驱动程序 NVCC
  • CUDA 的嵌套循环

    我想将我的 C 代码移植到 CUDA 主要计算部分包含3个for嵌套循环 for int i 0 i lt Nx i for int j 0 j
  • CUDA Thrust 库中counting_iterators 的用途和用法

    我很难理解counting iterator在 CUDA 的推力库中 它的目的是什么以及如何使用 它在其他编程语言 例如 C 中也可用吗 计数迭代器只是一个迭代器 它从每次迭代器递增时前进的序列中返回下一个值 最简单的例子是这样的 incl
  • 摆脱异步 cuda 流执行期间的忙等待

    我正在寻找一种方法 如何摆脱以下代码中主机线程中的忙等待 不要复制该代码 它仅显示我的问题的想法 它有许多基本错误 cudaStream t steams S N for int i 0 i lt S N i cudaStreamCreat
  • GPU上动态分配内存

    是否可以在内核内的 GPU 全局内存上动态分配内存 我不知道我的答案有多大 因此我需要一种方法为答案的每个部分分配内存 CUDA 4 0 允许我们使用 RAM 这是一个好主意还是会降低速度 可以在内核中使用 malloc 检查以下内容 摘自
  • 使用 GPU 进行 Matlab 卷积

    我用gpuArray尝试了matlab的卷积函数conv2 convn 例如 convn gpuArray rand 100 100 10 single gpuArray rand 5 single 并将其与 cpu 版本 convn ra
  • 使用 cudamalloc()。为什么是双指针?

    我目前正在浏览有关的教程示例http code google com p stanford cs193g sp2010 http code google com p stanford cs193g sp2010 学习CUDA 演示的代码 g
  • 在 Cuda 中简单添加两个 int,结果始终相同

    我开始了学习Cuda的旅程 我正在玩一些 hello world 类型的 cuda 代码 但它不起作用 我不知道为什么 代码非常简单 取两个整数并将它们添加到 GPU 上并返回结果 但无论我将数字更改为什么 我都会得到相同的结果 如果数学那
  • 对 CUDA 操作进行计时

    我需要计算 CUDA 内核执行的时间 最佳实践指南说我们可以使用事件或标准计时函数 例如clock 在Windows中 我的问题是使用这两个函数给出了完全不同的结果 事实上 与实践中的实际速度相比 事件给出的结果似乎是巨大的 我实际上需要这
  • CUDA-Kernel 应该根据块大小动态崩溃

    我想做稀疏矩阵 密集向量乘法 假设用于压缩矩阵中条目的唯一存储格式是压缩行存储 CRS 我的内核如下所示 global void krnlSpMVmul1 float data mat int num nonzeroes unsigned
  • 如何从尖点库矩阵格式获取原始指针

    我需要从尖点库矩阵格式获取原始指针 例如 cusp coo matrix
  • CUDA cutil.h 在哪里?

    有谁知道包含 cutil h 的 SDK 工具包在哪里 我尝试了 CUDA toolkits3 2 和 toolkits5 0 我知道这个版本已经不支持 cutil h 我还注意到一些提到的如何在 Linux 中包含 cutil h htt
  • 将数据从 GPU 复制到 CPU - CUDA

    我在将数据从 GPU 复制到 CPU 时遇到问题 一开始我在 GPU 空间中创建变量 device float gpu array 在此 GPU 函数中 我想将数据从 od fS gi 值 0 43 复制到 gpu array global
  • 我可以将 CUDA 与非 NVIDIA GPU 一起使用吗? [复制]

    这个问题在这里已经有答案了 我正在寻找一种在没有 NVIDIA GPU 的系统上运行 CUDA 程序的方法 我尝试安装 MCUDA 和 gpuOcelot 但安装似乎遇到一些问题 我已经浏览了中给出的答案如何使用软件实现在没有 GPU 的情
  • 嵌套循环中数组的二维累积和——CUDA实现?

    我一直在考虑如何使用归约在 CUDA 上执行此操作 但我对如何完成它有点不知所措 C 代码如下 要记住的重要部分 变量预先计算的值依赖于取决于both循环迭代器 另外 变量ngo并不是每个值都是唯一的m 例如m 0 1 2 可能有ngo 1
  • 针对 openpose 将 GCC 9.3.0 降级到 7 后,cuda_compile_1_ generated_batch_norm_layer.cu.o.Release.cmake 出现 CMake 错误

    你知道我该如何解决以下错误吗 这是在我使用以下命令从 GCC 9 3 0 降级到 7 后发生的 使用以前版本的 GCC 我收到此错误 CMake 不支持的 GNU 版本 不支持高于 8 的 gcc 版本 https stackoverflo

随机推荐

  • 突出显示组合框中的特定项目

    我有一个场景 我用模板名称填充组合框 在这些模板中 有一个是默认模板 我想在填充组合框时突出显示默认模板名称 以便用户知道其中哪一项是默认的 可以这样做吗 如果是的话怎么办 我正在使用 C 2 0 中的 Windows 窗体 这在一定程度上
  • MvvmCross Android - 按钮命令的relativesource绑定的替代方案

    I have a list of items bound to a MvxBindableListView with a MvxItemTemplate I usually have 4 items in my list bound to
  • 如何在 Rails 迁移中将列(包含内容)移动到另一个表?

    我需要将一些列从一个现有表移动到另一个表 如何使用 Rails 迁移来完成此操作 class AddPropertyToUser lt ActiveRecord Migration def self up add column users
  • 角度帖子json来表达

    我正在尝试将 json 发送到服务器节点 expressangular js 我的服务器 js Setup Dependencies var express require express Start Express var app exp
  • 使用 Pinterest SDK 发送到已释放实例的消息

    我正在使用 Pinterest iOS SDK 分享我的 iPad 应用程序中的项目 下面的代码片段总是会崩溃message sent to deallocated instance在评论线上 NSString clientId NSMut
  • 自动将 ipython 输出为 pdf

    我有一个小程序 基本上可以进行各种统计计算并打印结果和图表 目前 获得程序的良好 pdf 输出的一种便捷方法是使用魔术命令 matplotlib inline 在 Jupyter IPython Notebook 中运行我的代码 并通过执行
  • Java 正则表达式,具有积极的向后展望和消极的向前展望

    我正在尝试从这种字符串中提取ou persons ou dc company dc org最后一个字符串立即之前是 a coma 没有跟随 在最后一种情况下 这应该给出dc company dc org 从正则表达式来看 这似乎是消极展望背
  • 在 git add 中显示更多上下文

    例如 使用 git diff 我可以执行以下操作 以在显示差异时显示 10 条周围的上下文行 git diff U10 我可以用 git add patch 做类似的事情吗 理想情况下我想 git add p U10 但我没有找到这样的选项
  • 启用 WhiteNoise 时“collectstatic”命令失败

    我正在尝试通过以下方式提供静态文件白噪声 https github com evansd whitenoise blob master docs django rst as per Heroku https devcenter heroku
  • 获取新的 Apple 设备令牌?

    我正在创建一个应用程序 允许用户注销该应用程序并根据需要以其他用户身份登录 新用户登录后 有什么方法可以从 Apple 获取新的设备令牌吗 有没有办法强制调用didRegisterForRemoteNotificationsWithDevi
  • 确定网络连接带宽(速度)wifi和移动数据

    我想要获取以 kbps 或 mbps 为单位的网络连接带宽 如果设备连接到 WiFi 那么它应该返回网络带宽 速度 以及移动数据 它将返回 wifi 能力速率 但我想要精确的数据传输速率 public String getLinkRate
  • 更改 recyclerView 项目背景 onClick?

    当我按下我的按钮时我就会做到这一点recyclerView这会改变它的背景颜色 这样按下的时候就会可见 但我不太喜欢android 所以我不知道该怎么做 我尝试过在网上找到的一些指南 但其中大多数对我不起作用 就像这样guide https
  • 如何使用 nunit 和 moq 进行异常处理?

    我正在尝试使用 nunits 新的异常处理方式 但我发现很难找到有关它的信息以及如何将它与最小起订量一起使用 我现在有最小起订量 它在模拟方法上抛出异常 但我不知道如何使用 nunit 来捕获它并查看它 有几种不同的方法可以做到这一点 我使
  • `with_items` 输出太冗长

    我编写了一个 ansible 任务来迭代设置列表 使用with items 现在 当我运行 ansible 时 我的所有设置都会被记录 它非常冗长 让人很难看出发生了什么 但是 如果我禁用所有输出no log 当特定项目失败时 我将无法识别
  • 使用 React 构建 CRM Web 资源

    我是新的 Dynamics CRM 我的项目包括表单提交和验证 我计划使用带有 Redux 前端的 React 和 CRM 的服务来构建一个产品 构建 CRM Web 资源的 CRM 最佳实践是什么 有人可以指导我吗 https githu
  • 如何使用 Flask 和 Celery 定期运行函数?

    我有一个烧瓶应用程序 大致如下所示 app Flask name app route methods POST def foo data json loads request data do some stuff return OK 现在另
  • 自定义龙目岛超级构建器

    我有一个父抽象类 Parent 和子类 Child 我正在使用 SuperBuilder 生成构建器 API 现在 我想对 Parent 和 Child 类的成员执行一些验证 作为构建的一部分 我找不到任何解决方案来自定义龙目岛超级构建器
  • 使用 C API 创建自定义类对象的 numpy 数组

    使用 C API 我想创建一个包含类型对象的 numpy 数组Quaternion 这是我用 C 编写的一个类 我已经有一个数组 实际上是一个std vector 并且我想制作一个副本 或者如果可能的话使用相同的内存 由于这不是基本类型 我
  • 在底部导航视图中不设置预先选择的项目

    我正在将材料设计库中的新底部导航视图添加到项目中 并且我希望默认情况下没有预先选择的项目 目前默认选择第一项 我用过 mBottomNavigation getMenu getItem 0 setChecked false 但是当在 for
  • 使用 CUDA 向量类型有优势吗?

    CUDA 提供内置矢量数据类型 例如uint2 uint4等等 使用这些数据类型有什么优点吗 假设我有一个由两个值 A 和 B 组成的元组 将它们存储在内存中的一种方法是分配两个数组 第一个数组存储所有 A 值 第二个数组存储与 A 值对应