Branchendivergenz, CUDA und Kinetic Monte Carlo

Ich habe also einen Code, der Kinetic Monte Carlo auf einem Gitter verwendet, um etwas zu simulieren. Ich verwende CUDA, um diesen Code auf meiner GPU auszuführen (obwohl ich glaube, dass die gleiche Frage auch für OpenCl gilt).

Dies bedeutet, dass ich mein Gitter in kleine Untergitter aufteile und jeder Thread auf eines davon wirkt. Da ich KMC mache, hat jeder Thread diesen Code:

   While(condition == true){
     *Grab a sample u from U[0,1]*
      for(i = 0; i < 100;i++){
         *Do some stuff here to generate A*
          if(A > u){
              *Do more stuff here, which could include updates to global memory*
               break();
           }
      }
   }

A ist für verschiedene Threads unterschiedlich und so ist u und 100 nur eine Zufallszahl. Im Code kann dies 1000 oder sogar 10000 sein.

Werden wir also keine Branchendivergenz haben, wenn die Zeit dafür gekommen ist, dass ein Thread das durchläuft, wenn? Wie stark kann dies die Leistung beeinträchtigen? Ich weiß, dass die Antwort vom Code in der if-Klausel abhängt, aber wie skaliert diese, wenn ich mehr und mehr Threads hinzufüge?

Ein Hinweis darauf, wie ich Verluste / Gewinne bei der Leistung einschätzen kann, wäre ebenfalls willkommen.

Vielen Dank!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage