gpt4 book ai didi

cuda - 使用 CUDA 向量类型有什么好处吗?

转载 作者:行者123 更新时间:2023-12-04 01:00:50 27 4
gpt4 key购买 nike

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

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

最佳答案

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

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

查看 char4 的声明:

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

类型对齐到 4 个字节。不知道是什么 __device_builtin__做。也许它会在编译器中触发一些魔法......
float1 的声明看起来有点奇怪, float2 , float3float4 :
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此时的值,由于 128 字节的事务,其他值( yzw )将被拉入 L1。当 warp 稍后尝试访问它们时,它们可能不再在 L1 中,因此必须发出新的全局内存事务。此外,如果编译器能够发出更广泛的指令以同时读取更多值,以备将来使用,它将使用寄存器来存储加载点和使用点之间的那些,可能会增加寄存器的使用的内核。

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

关于cuda - 使用 CUDA 向量类型有什么好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12340384/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com