OpenCL 128bit 乘法结果
OpenCL 128bit multiplication result
我需要在 OpenCL 内核中乘以两个无符号 64 位整数(unsigned long),结果是一个 128 位整数(unsigned long long)。
较新版本的 openCL 似乎支持这种类型。
unsigned long m1, m2;
.
.
unsigned long long result = m1 * (unsigned long long)m2;
此代码有效,但速度很慢。这实质上是将 64 位乘以 128 位。 64位我只需要64位。
有没有一种方法可以设置乘法的结果类型,而无需将一个被乘数转换为 128 位?
一个体面的编译器应该注意到您的 64->128 位向上转换,并且不会为归零的高源位生成任何机器代码。
但是,GPU 在进行大整数乘法时往往很慢。例如,根据我知道的最新信息,AMD's GCN GPUs are 5 times faster at multiplying floats than 32*32bit integers. 我怀疑这只是一个 32 位(低)结果,因为获取高 32 位是一个单独的指令,所以它可能更慢对于完整的 64 位结果。
现在大多数 GPU 在处理 24 位整数时都快得多。 (在上述 AMD GPU 的情况下,速度快 5 倍。)我想知道您是否可以将 64 位整数分解为 3 个 24 位字(如果您的值适合 48 位,甚至可以分解为 2 个)并实现手工长乘法。 (可能通过 Karatsuba 或类似算法;不确定哪个最有效,因为 mul、add 和 mad 在 GPU 上往往彼此速度相同。)尽管获得每个 24x24 位乘法的高 16 位将是困难的部分,因为 OpenCL 似乎没有让您通过专用函数访问它,这与通过 mul24 的低 32 位不同。如果您的目标是一个或多个特定的 OpenCL 实现,则可能 hand-write 汇编语言用于您目标的 GPU。
我需要在 OpenCL 内核中乘以两个无符号 64 位整数(unsigned long),结果是一个 128 位整数(unsigned long long)。
较新版本的 openCL 似乎支持这种类型。
unsigned long m1, m2;
.
.
unsigned long long result = m1 * (unsigned long long)m2;
此代码有效,但速度很慢。这实质上是将 64 位乘以 128 位。 64位我只需要64位。
有没有一种方法可以设置乘法的结果类型,而无需将一个被乘数转换为 128 位?
一个体面的编译器应该注意到您的 64->128 位向上转换,并且不会为归零的高源位生成任何机器代码。
但是,GPU 在进行大整数乘法时往往很慢。例如,根据我知道的最新信息,AMD's GCN GPUs are 5 times faster at multiplying floats than 32*32bit integers. 我怀疑这只是一个 32 位(低)结果,因为获取高 32 位是一个单独的指令,所以它可能更慢对于完整的 64 位结果。
现在大多数 GPU 在处理 24 位整数时都快得多。 (在上述 AMD GPU 的情况下,速度快 5 倍。)我想知道您是否可以将 64 位整数分解为 3 个 24 位字(如果您的值适合 48 位,甚至可以分解为 2 个)并实现手工长乘法。 (可能通过 Karatsuba 或类似算法;不确定哪个最有效,因为 mul、add 和 mad 在 GPU 上往往彼此速度相同。)尽管获得每个 24x24 位乘法的高 16 位将是困难的部分,因为 OpenCL 似乎没有让您通过专用函数访问它,这与通过 mul24 的低 32 位不同。如果您的目标是一个或多个特定的 OpenCL 实现,则可能 hand-write 汇编语言用于您目标的 GPU。