cuda数组排序带有推力,内存不足
cuda array sorting with thrust, not enough memory
我试图使用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()开始时停止工作。
- stable_sort()还需要多少内存
- 有办法解决这个问题吗?(即使它会让它慢一点或其他什么)
- 有没有其他排序算法不需要比原始数组更多的内存
感谢您的帮助:)
文献中有一些技术用于处理对太大而无法放入RAM
的数据进行排序的问题,例如将部分值保存在文件中等等。例如:使用Python 在2MB的RAM中对一百万个32位整数进行排序
你的问题不那么复杂,因为你的输入适合RAM
,但对你的GPU来说太少了。您可以使用策略parallel by Regular Sampling
来解决这个问题。您可以在这里看到一个应用于quicksort
的技术示例。
长话短说,您将阵列划分为适合GPU内存的较小子阵列。然后对每个子数组进行排序,最后在Regular Sampling方法的前提下合并结果。
您可以使用混合方法,通过将每个子阵列分配给不同的核心(使用多线程)来对CPU中的一些子阵列进行排序,同时将其他子阵列发送到GPU。您甚至可以使用消息传递接口(如MPI
)将这项工作细分为不同的处理器。或者,你可以简单地在GPU上逐一对每个子阵列进行排序,然后使用CPU进行最后的合并步骤,利用(或不利用)多核。
相关文章:
- 显示错误输出的简单数组排序程序
- C 使用单个函数对具有多种值类型的数组排序
- 2D数组排序,空格打乱顺序
- C 2D数组排序
- C++数组排序 - 将"bbba"和"0001"视为不正确排序的问题
- 数组排序功能
- c++ WINAPI 共享内存结构数组
- CString 数组排序
- 简单的数组排序/检查 划分和征服版本
- 使用MPI和C 发送静态内存2D数组
- C++ 中的多维数组排序
- 选择在++中对并行数组排序
- C++:二维指针数组排序:选择排序不适用于某些实例
- C++动态分配内存返回数组
- 获取内存值数组的最快方法
- 在函数 C++ 中分配内存 2d 数组
- CString -> 内存泄漏数组?
- C++字符串数组排序
- C++数组排序,内存错误
- cuda数组排序带有推力,内存不足