cuda数组排序与推力,没有足够的内存

时间:2013-02-11 10:08:06

标签: c++ cuda gpu thrust

我正在尝试使用Thrust对数组进行排序,但如果数组太大则无法正常工作。 (我有一个GTX460 1GB内存)

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

我的.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. 是否有另一种排序算法不需要比原始数组更多的内存?

  4. 感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

在演讲中,有一些技术用它来处理无法容纳在RAM中的数据排序问题,例如在文件中保存部分值等等。所以例子=&gt; Sorting a Really Big FileSorting a million 32-bit integers in 2MB of RAM using Python

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

长话短说,你基本上将数组分成较小的子阵列,这些子阵列可以放在GPU的内存中。然后对每个子数组进行排序,最后在常规采样方法的前提下合并结果库。

您可以使用混合方法,对CPU中的某些子阵列进行排序,将每个子阵列分配到不同的核心(使用多线程),同时将其他子阵列发送到GPU。您甚至可以使用消息传递接口(例如MPI)将此工作细分到不同的处理器。或者您可以在GPU上逐个对每个子阵列进行排序,并使用CPU执行最终合并步骤,无论是否有利于多核。