我正在尝试使用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()开始时停止工作。
感谢您的帮助:)
答案 0 :(得分:1)
在演讲中,有一些技术用它来处理无法容纳在RAM中的数据排序问题,例如在文件中保存部分值等等。所以例子=&gt; Sorting a Really Big File,Sorting 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执行最终合并步骤,无论是否有利于多核。