2016-11-02 3 views
0

Ich weiß, dass Aufrufe an einen Funktor mit thrust::for_each mit Daten in thrust::host_vector eine parallele Ausführungsrichtlinie haben, aber werden sie tatsächlich parallel ausgeführt?Aufruf eines Schubfunktors auf dem Host zum Ausführen mehrerer Threads

Wenn nicht, was wäre der richtige Weg, diese aufzurufen, obwohl ich weiß, dass das System, auf dem ich es ausführe, virtualisiert ist, so dass alle Kerne auf demselben Rechner zu sein scheinen?

[EDIT]

Ich weiß, dass es so etwas wie thrust::omp::par ist aber ich kann nicht scheinen zu können, mit OpenMP einen vollen Schub Beispiel zu finden.

Antwort

1

Im Allgemeinen werden Schuboperationen, die auf dem "Host" ausgeführt werden, nicht parallel ausgeführt. Sie verwenden einen einzelnen Host-Thread.

Wenn Sie Schuboperationen parallel auf der CPU ausführen möchten (mit mehreren CPU-Threads), empfiehlt sich die Verwendung des Schub-OpenMP-Backends. Ein vollständiges Beispiel ist here.

Ein anderes bearbeitetes Beispiel ist here.

+0

Ich habe eine Follow-up-Frage: Also wenn ich einen (benutzerdefinierten) Funktor verwenden würde, würde es als '__device__' oder' __host__' definieren? –

+0

Es scheint, dass es "__host__" sein sollte, obwohl beide funktionieren sollten –

+0

'__device__' und' __host__' sind nicht dasselbe wie das Schub-Backend. Für Schub- "Host" -Operationen muss der Funktor die "__host__" -Dekoration enthalten. Für "Backend-Operationen", die die GPU als Backend verwenden, muss der Funktor die "__device__" -Dekoration enthalten. Für alle CPU-basierten Backends (einschließlich OMP) muss der Funktor die Dekoration "__host__" enthalten. Der Grund dafür ist, dass "__host__" und "__device__" nicht genau dasselbe bedeuten wie das "Host" - und Schub "Device" - Backend. –

Verwandte Themen