2016-07-05 19 views
0

Ich bin ein Neuling für CUDA. Ich habe einfach versucht, ein Array mit Thrust zu sortieren.Langsame Sortierung mit Schub, CUDA

clock_t start_time = clock(); 

thrust::host_vector<int> h_vec(10); 
thrust::generate(h_vec.begin(), h_vec.end(), rand); 
thrust::device_vector<int> d_vec = h_vec; 

thrust::sort(d_vec.begin(), d_vec.end()); 
//thrust::sort(h_vec.begin(), h_vec.end()); 

clock_t stop_time = clock(); 
printf("%f\n", (double)(stop_time - start_time)/CLOCKS_PER_SEC); 

Zeit nahm d_vec ist 7.4s zu sortieren, und die Zeit nahm h_vec ist 0,4s

zu sortieren ich auf Gerätespeicher seine parallele Berechnung gehe davon aus, so sollte es nicht schneller sein?

+2

Höchstwahrscheinlich messen Sie die [Zeit für die Kontexterstellung] (http://stackoverflow.com/q/10415204)/5085250). Außerdem können Sie nicht erwarten, dass * kleine * Vektoren auf hochparallelen Architekturen schneller sortiert werden. Versuchen Sie mit Vektorgrößen >> 10000. – havogt

+0

Ja, Sie haben Recht, diese Zeiten waren bei der ersten Ausführung. Außerdem habe ich versucht mit 50k Punkten, und ich habe Timing auf Host und Gerät auf 0,12s. Der Unterschied wird groß, wenn die Größe nahe bei 100000 liegt. Kann ich davon ausgehen, dass das Sortieren mit h_vec auf der CPU erfolgt? – Syed

+0

Ja, das Sortieren nach 'h_vec' erfolgt auf dem Host. Vielleicht sollten Sie den [Schub-Schnellstart-Leitfaden] (https://github.com/thrust/thrust/wiki/Quick-Start-Guide) lesen, in dem der Versand von Schubalgorithmen behandelt wird. –

Antwort

3

Wahrscheinlich ist das Hauptproblem Kontexterstellungszeit: der erste CUDA-Aufruf initialisiert den CUDA-Kontext, der einige Zeit benötigt, siehe here. Daher sollten Sie erst nach dem ersten CUDA-Aufruf mit der Zeitmessung beginnen.

Im Allgemeinen kann man mit GPU-Code nur mit Beschleunigung rechnen, wenn der Grad der Parallelität hoch genug ist. Die Vektorgröße von 10 wie im Beispielcode ist definitiv zu klein, um eine Beschleunigung zu erreichen. Mit einer Vektorgröße von> 10000 können Sie erwarten, dass Sie eine moderne GPU voll ausnutzen.

Sie sollten auch darüber nachdenken, nur die Sortierzeit ohne die Kopie zu messen, da Sie im nächsten Schritt oft mit dem Gerätevektor arbeiten. Dann können Sie den Kopiervorgang als einmaligen Einrichtungsaufwand betrachten. (Wenn die Sortierung jedoch die einzige Operation auf dem Gerät ist, ist es natürlich sinnvoll, die Memkopie in die Messung einzubeziehen.)