LGV, c'est pas bete d'utiliser le preprocesseur pour faire dnas le moins moche. Surtout qu'en fait j'ai une dizaine de parametre a cette fonction. Donc si je peux ecrire les parametres qu'une seule fois, ca fera deja du bien.
papy, LGV, en l'occurence, ce n'est pas un applatissement de structure de donne. C'est une histoire d'un parametre qui est constant et qui permet de simplifier le code assembleur dans une partie critique. J'avais parler il y a un bout de temps d'utiliser des templates pour parametre statiquement la taille de structures de donnes [1]. Et ici je pense que c'est essentiellement le meme comportement que je vois.
Mon parametre template est le nombre de colonnes d'un jeu matrices qui sont passees en parametre. Je passe du temps a faire des calculs d'indice i*X+j. Je ne sais pas bien d'ou vient la difference de performance qui est si significative ici. Mais comme c'est du code CUDA et que je ne connais pas l'assembleur du truc (je ne suis meme pas sur qu'il soit public?) c'est difficile a dire. J'imagine que la difference vient de l'economie d'un registre par thread (une centaine de million) et que ca evite le register spilling. Aussi, il est possible que ca evite une multiplication parceque j est constant par thread. du coup tu peux faire offtab = tab+sizeof(int)*j en amont. et il te reste a faire offtab+i*X*sizeof(int). Et si X est connu a la compilation tu peux precalculer X*sizeof(int) et economiser une multiplication (et un registre). Enfin bon, experimentalement, ca va plus vite
[1] http://erik.deblan.org/blog/index.php?article6/quand-les-conteneurs-standards-deviennent-trop-lents