2017-02-28 1 views
1

Was wissen wir über die Abwicklungsfähigkeiten von nvcc, wenn die Richtlinie #pragma unroll auftritt? Wie anspruchsvoll ist es? Hat jemand mit immer komplexeren Schleifenstrukturen experimentiert, um zu sehen, was er aufgibt?Was wissen wir über die "Stärke" von nvcC#pragma entrollen?

Zum Beispiel

#pragma unroll 
for(int i = 0; i < constexpr_value; i++) { foo(i); } 

wird sicherlich entrollen (bis zu einer ziemlich großen Reise Zahl, siehe this answer). Was ist mit:

#pragma unroll 
for(int i = 0; i < runtime_variable_value and i < constexpr_value; i++) { 
    foo(i); 
} 

Der Graf hier ist nicht bekannt, Reise-Schleife, aber es hat ein konstantes obere Schranke und vollständiges Abrollen der Schleife mit einigen bedingten Sprüngen durchgeführt werden kann.

Und dann, was ist:

template <typename T> 
constexpr T simple_min(const T& x, const T& y) { return x < y ? x : y; } 

#pragma unroll 
for(int i = 0; i < simple_min(runtime_variable_value, constexpr_value); i++) {  
    foo(i); 
} 

, die auf dasselbe wie die oben zusammenstellen sollte?

Hinweis: Wenn Sie beabsichtigen zu antworten "führen Sie Ihre eigenen Experimente", dann - ich beabsichtige dies zu tun, zumindest für mein Beispiel, und schauen Sie auf die PTX, wenn niemand die allgemeine Antwort bereits kennt, in diesem Fall Ich werde diese Frage teilweise beantworten. Aber ich würde etwas autoritärer und basierend auf breiterer Erfahrung bevorzugen.

+0

Dies wird sehr deutlich in der Programmieranleitung beschrieben – talonmies

+0

@talonmies: Eigentlich ist es nicht ... siehe meine Bearbeitung über die tatsächliche Anzahl der Fahrten gegen Obergrenze auf der Reise zählen. – einpoklum

Antwort

2

Die Regeln des Abrollens sind extrem einfach - wenn der Compiler die Anzahl der Schleifenauslöser nicht als ganzzahligen konstanten Wert herleiten kann, wird die Schleife nicht automatisch entrollt. In diesem Fall wird auch eine Warnung ausgegeben, die Sie darüber informiert.

Wenn Sie Code mit einer nicht konstanten Schleife Reise Anzahl haben, können Sie noch in der Lage sein, den Compiler zu zwingen, durch Hinzufügen eines integralen konstanter Ausdruck mit einem Wert größer als eins nach dem entrollen Pragma (dh #pragma unroll 8)

abzurollen

All dies wird in dem relevanten Abschnitt der äußerst deutlich diskutiert.

Verwandte Themen