2017-02-28 4 views
1

Que savons-nous des capacités de déroulement de nvcc lorsque vous rencontrez la directive #pragma unroll? À quel point est-ce sophistiqué? Est-ce que quelqu'un a expérimenté avec des structures en boucle de plus en plus complexes pour voir ce qu'il abandonne?Que savons-nous de la «force» du déroulement #pragma de nvcc?

Par exemple,

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

va sûrement déroulez (jusqu'à un nombre de voyage assez grand, voir this answer). Qu'en est-il:

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

Le nombre de voyage en boucle n'est pas connue, mais il a une limite supérieure constante et complète déroulage de la boucle peut être réalisée, avec des sauts conditionnels.

Et puis, qu'en est-:

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); 
} 

qui devrait compiler à la même chose que ci-dessus? Si vous avez l'intention de répondre "mener vos propres expériences", alors - j'ai l'intention de le faire, au moins pour mon exemple, et regardez le PTX si personne ne connaît déjà la réponse générale, auquel cas Je vais partiellement répondre à cette question. Mais je préférerais quelque chose de plus autoritaire et basé sur une expérience plus large.

+0

Ceci est très clairement décrit dans le guide de programmation – talonmies

+0

@talonmies: En fait, ce n'est pas ... voir mon édition sur le nombre de voyages réel par rapport à la limite supérieure du nombre de voyages. – einpoklum

Répondre

2

Les règles de déroulement sont extrêmement simples - si le compilateur ne peut pas déduire le nombre de déclenchements de boucle comme une valeur de constante intégrale, il ne déroulera pas automatiquement la boucle. Dans ce cas, il émet également un avertissement vous informant de cela.

Si vous avez du code avec un nombre de voyage en boucle non constante, vous pouvez toujours être en mesure de forcer le compilateur à déroulez en ajoutant une expression constante solidaire d'une valeur supérieure à un après l'Déroulez pragma (c.-à-#pragma unroll 8)

Tout cela est très clairement discuté dans la section pertinente du documentation.