2013-02-11 71 views
1

我想使用推力排序數組,但它不工作,如果數組太大。 (我有一個GTX460 1GB內存)cuda排序與推力,沒有足夠的內存

我使用CUDA與C對VS2012 ++集成,這是我的代碼:

我的.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. 是否有另一種排序算法不需要比原始數組更多的內存?

感謝您的幫助:)

+0

而不是三個操作,只能嘗試:'thrust :: stable_sort(data,data + n);' – sgarizvi 2013-02-11 10:27:10

+0

@ sgar91:這將導致在主機CPU上運行排序... – talonmies 2013-02-11 10:37:38

+0

@talonmies。感謝您的澄清。無論如何,我一直以爲推力使用設備。 – sgarizvi 2013-02-11 10:52:10

回答

1

中有一些技術使用它來處理,不能在RAM適合如文件保存部分值數據排序的問題和講座等等。因此,示例=>Sorting a Really Big File,Sorting a million 32-bit integers in 2MB of RAM using Python

您的問題,因爲您的輸入適合內存,但是對於您的GPU太「複雜」,所以不那麼複雜。您可以使用策略parallel by Regular Sampling解決此問題。您可以在quicksort上看到here這個後一種技術的示例。長期以來,您基本上將陣列劃分爲更小的子陣列,這些子陣列可以適合GPU的內存。然後您對每個子數組進行排序,最後在常規抽樣方法的前提下合併結果數據庫。

您可以使用混合方法,對CPU中的一些子陣列進行排序,將每個子陣列分配給不同的內核(使用多線程),同時將其他子陣列發送給GPU。您甚至可以使用消息傳遞接口(如MPI)將此工作細分到不同的處理器。或者,您可以簡單地在GPU上對每個子陣列進行排序,然後使用CPU執行最後的合併步驟,從而取得或不利於多核。