cuda数组排序带有推力,内存不足

cuda array sorting with thrust, not enough memory

本文关键字:内存不足 数组排序 cuda      更新时间:2023-10-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;
}

my.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. 有没有其他排序算法不需要比原始数组更多的内存

感谢您的帮助:)

文献中有一些技术用于处理对太大而无法放入RAM的数据进行排序的问题,例如将部分值保存在文件中等等。例如:使用Python 在2MB的RAM中对一百万个32位整数进行排序

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

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

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