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.
Ceci est très clairement décrit dans le guide de programmation – talonmies
@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