OpenCL 128bit乘法结果

时间:2018-03-16 15:05:08

标签: opencl multiplication 128-bit

我需要在OpenCL内核中复用两个无符号64位整数(无符号长整数),结果为128位整数(无符号长整数)。

较新版本的openCL似乎支持此类型。

unsigned long m1, m2;
.
.
unsigned long long result = m1 * (unsigned long long)m2;

此代码有效,但速度很慢。这基本上是64位乘以128位。我只需要64位64位。

有没有办法设置乘法的结果类型,而不将一个被乘数转换为128位?

1 个答案:

答案 0 :(得分:2)

一个体面的编译器应该注意到你的64-> 128bit upcast,并且不会为归零的高源位产生任何机器代码。

然而,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实现,则可以手动编写您要定位的GPU的汇编语言。