【问题标题】:opencl Bitonic sort with 64 bits keys使用 64 位密钥的 opencl 双音排序
【发布时间】:2015-03-20 18:55:12
【问题描述】:

我使用了 nvidia sdk Bitonic Sort,它对我来说非常有用。 但它是 32 位 (uint) 我真的需要 ulong 键。 我通常一次只有 2^14 个键和 2 个键。 我到处搜索,但找不到任何为 ulong 设计的内核。

我尝试修改 nvidia sdk Bitonic Sort 以使用 ulong 键,但它不起作用。内核不会崩溃,但在调用 clEnqueueNDRangeKernel 后出现错误:CL_INVALID_COMMAND_QUEUE

谁能告诉我如何修改双音排序或其他类似 RadixSort,或任何可以对 ulong 键进行排序的东西?


我正在运行 NVIDIA Quadro 4000 OpenCL 1.1 CUDA 6.5.20 FULL_PROFILE 我用的是原来的nvidia sdk BitonicSort.cl

我只是将“ulong”用于键和值的输入和输出,而不是“uint”

感谢您的帮助

【问题讨论】:

  • 你能把你修改的内核贴出来吗?还有你在哪些设备上运行内核?
  • 不幸的是,这些快速排序算法也相当复杂,很难适应不同的数据类型。我曾经使用过Intel bitonic sort,我发现它不适用于大于 10 亿的值,即使它使用了 uint。
  • @ Baiz 我试图通过在键上打包 30 位和在值上再打包 18 位来欺骗它,并修改我的比较器以使用该额外信息,但似乎排序不稳定。为什么在世界上应该将如此强大的算法限制为 32 位。真丢人。

标签: sorting hash opencl


【解决方案1】:

我终于做了一个解决方法来满足我的需要。
我使用了 30 位密钥和 18 位高位值进行排序。
我只更改了比较器(2 行):

'#define MASK 0xFFFFC000 // 以满足您的需要

从此: if( (*keyA > *keyB) == dir )
为此: if(((*keyA > *keyB)||((*keyA == *keyB)&&((*valA & MASK)> (*valB & MASK)))) == dir )

效果很好。
但是,这仍然是一种解决方法,问题仍然存在,我们需要 64 位密钥 + 32 位(或 64 位)值是什么?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-06
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 2015-10-07
    • 2018-03-07
    相关资源
    最近更新 更多