【问题标题】:cuda array sorting with thrust, not enough memorycuda数组排序与推力,没有足够的内存
【发布时间】:2020-12-29 01:14:16
【问题描述】:

我正在尝试使用 Thrust 对数组进行排序,但如果数组太大,它将不起作用。 (我有一个 GTX460 1GB 内存)

我在 VS2012 上使用带有 c++ 集成的 cuda,这是我的代码:

我的.cpp

extern "C" void thrust_sort(uint32_t *data, int n);

int main(int argc, char **argv){
    int n = 2<<26;
    uint32_t * v = new uint32_t[n];
    srand(time(NULL));
    for (int i = 0; i < n; ++i) {
        v[i] = rand()%n;
    }

    thrust_sort(v, n);

    delete [] v;
    return 0;
}

我的.cu

extern "C"
void thrust_sort(uint32_t *data, int n){
    thrust::device_vector<uint32_t> d_data(data, data + n);
    thrust::stable_sort(d_data.begin(), d_data.end());
    thrust::copy(d_data.begin(), d_data.end(), data);
}

程序在 stable_sort() 开始时停止工作。


  1. stable_sort() 需要多少内存?
  2. 有没有办法解决这个问题? (即使它让它变慢了一些)
  3. 是否有另一种排序算法不需要比原始数组更多的内存?

感谢您的帮助:)

【问题讨论】:

  • 推力排序requires O(N) temporary space。因此,当您用完大约一半的 GPU 内存来存储要排序的数组时,您将耗尽空间。我不知道解决这个问题的方法。我玩过back40 sortMGPU sort,两者都需要额外的存储空间,虽然我还没有对多少进行基准测试。

标签: c++ arrays cuda gpu thrust


【解决方案1】:

文献中有一些技术用于处理数据太大而无法放入RAM的问题,例如将部分值保存在文件中等。一个例子:Sorting a million 32-bit integers in 2MB of RAM using Python

您的问题不那么复杂,因为您的输入适合 RAM,但对于您的 GPU 来说太太多了。您可以使用parallel by Regular Sampling 策略解决此问题。您可以看到here 是这种技术应用于quicksort 的示例。

长话短说,您将数组划分为适合 GPU 内存的较小子数组。然后对每个子数组进行排序,最后,在常规采样方法的前提下合并结果。

您可以使用混合方法,通过将 CPU 中的一些子数组分配给不同的内核(使用多线程)对 CPU 中的一些子数组进行排序,同时将其他子数组发送到 GPU。您甚至可以使用消息传递接口(例如MPI)将这项工作细分到不同的处理器。或者,您可以简单地在 GPU 上对每个子数组进行一一排序,然后使用 CPU 进行最后的合并步骤,利用(或不利用)多核。

【讨论】:

    猜你喜欢
    • 2021-05-27
    • 2011-02-09
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多