如何在 CUDA 设备上处理 64 位字?
我想在 CUDA 平台上直接处理 64 位字(例如 uint64_t
vars)。
不过,据我所知,寻址空间、寄存器和 SP 架构都是基于 32 位的。
我实际上发现它可以正常工作(在我的 CUDA cc1.1 卡上):
__global__ void test64Kernel( uint64_t *word )
{
(*word) <<= 56;
}
但我不知道,例如,这如何影响寄存器的使用和每个时钟周期的操作数。
I'd like to handle directly 64-bit words on the CUDA platform (eg. uint64_t
vars).
I understand, however, that addressing space, registers and the SP architecture are all 32-bit based.
I actually found this to work correctly (on my CUDA cc1.1 card):
__global__ void test64Kernel( uint64_t *word )
{
(*word) <<= 56;
}
but I don't know, for example, how this affects registers usage and the operations per clock cycle count.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
地址是 32 位还是其他任何值都不会影响您可以使用的数据类型。在您的示例中,您有一个指向 64 位无符号整数的指针(32 位、64 位、3 位(!) - 无关紧要)。
CUDA 支持 64 位整数,但当然,对于每个 64 位值,您存储的数据量是 32 位值的两倍,因此将使用更多寄存器,并且算术运算将花费更长的时间(将两个 64 位整数相加将只需使用进位将其扩展为较小的数据类型即可推入下一个子字)。该编译器是一个优化编译器,因此会尽量减少这种影响。
请注意,使用双精度浮点(也是 64 位)仅在计算能力为 1.3 或更高(即目前为 1.3 或 2.0)的设备中受支持。
Whether addresses are 32-bit or anything else does not affect what data types you can use. In your example you have a pointer (32-bit, 64-bit, 3-bit (!) - doesn't matter) to a 64-bit unsigned integer.
64-bit integers are supported in CUDA but of course for every 64-bit value you are storing twice as much data as a 32-bit value and so will use more registers and arithmetic operations will take longer (adding two 64-bit integers will just expand it out onto the smaller datatypes using carries to push into the next sub-word). The compiler is an optimising compiler, so will try to minimise the impact of this.
Note that using double precision floating point, also 64-bit, is only supported in devices with compute capability 1.3 or higher (i.e. 1.3 or 2.0 at this time).