2

我需要在 OpenCL 内核中对两个无符号 64 位整数(无符号长整数)进行乘法运算,结果是一个 128 位整数(无符号长整数)。

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

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

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

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

4

1 回答 1

2

一个体面的编译器应该注意到您的 64->128 位向上转换,并且不会为归零的高源位生成任何机器代码。

然而,GPU 在大整数乘法时往往非常慢。例如,根据我知道的最新信息,AMD 的 GCN GPU 在乘以浮点数时比 32*32 位整数快 5 倍。我怀疑这只是一个 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 手动编写汇编语言'

于 2018-03-16T19:53:39.287 回答