Comment puis-je améliorer cette fonction sous CUDA?

Puis-je améliorer la fonction suivante sous CUDA ?

Ce que la fonction fait est,

Étant donné les ELM1 min et max , ELM1 et ELM , vérifiez si trois nombres quelconques de tableau ans[6] sont trouvés dans une ligne quelconque, de min à max , dans les tableaux D1 , D2 , D3 , D4 , D5 , D6 , si renvoyé 1 .

J’ai essayé d’utiliser des loops , OR -ing, AND -ing, en remplaçant goto par flag etc. etc. Mais cela semble être le moyen le plus rapide.

  __device__ bool THREEA(unsigned int n0, unsigned int n,unsigned int* ST1,unsigned int* D1, unsigned int* D2,unsigned int* D3,unsigned int* D4,unsigned int* D5,unsigned int* D6,unsigned int* ans) { unsigned int ELM, ELM1,flag; ELM = ST1[n0]+n; //local.37 ELM1 = n; //local.33 while (ELM1 < ELM) { flag = 0; if (D1[ELM1] == ans[0]) { flag++; } if (D2[ELM1] == ans[0]) { flag++; } if (D3[ELM1] == ans[0]) { flag++; } if (D4[ELM1] == ans[0]) { flag++; } if (D5[ELM1] == ans[0]) { flag++; } if (D6[ELM1] == ans[0]) { flag++; } if (flag != 1) goto onethreefour; if (D1[ELM1] == ans[1]) { flag++; } if (D2[ELM1] == ans[1]) { flag++; } if (D3[ELM1] == ans[1]) { flag++; } if (D4[ELM1] == ans[1]) { flag++; } if (D5[ELM1] == ans[1]) { flag++; } if (D6[ELM1] == ans[1]) { flag++; } if (flag != 2) goto onethreefour; if (D1[ELM1] == ans[2]) { return 1; } if (D2[ELM1] == ans[2]) { return 1; } if (D3[ELM1] == ans[2]) { return 1; } if (D4[ELM1] == ans[2]) { return 1; } if (D5[ELM1] == ans[2]) { return 1; } if (D6[ELM1] == ans[2]) { return 1; } if (D1[ELM1] == ans[3]) { return 1; } if (D2[ELM1] == ans[3]) { return 1; } if (D3[ELM1] == ans[3]) { return 1; } if (D4[ELM1] == ans[3]) { return 1; } if (D5[ELM1] == ans[3]) { return 1; } if (D6[ELM1] == ans[3]) { return 1; } if (D1[ELM1] == ans[4]) { return 1; } if (D2[ELM1] == ans[4]) { return 1; } if (D3[ELM1] == ans[4]) { return 1; } if (D4[ELM1] == ans[4]) { return 1; } if (D5[ELM1] == ans[4]) { return 1; } if (D6[ELM1] == ans[4]) { return 1; } if (D1[ELM1] == ans[5]) { return 1; } if (D2[ELM1] == ans[5]) { return 1; } if (D3[ELM1] == ans[5]) { return 1; } if (D4[ELM1] == ans[5]) { return 1; } if (D5[ELM1] == ans[5]) { return 1; } if (D6[ELM1] == ans[5]) { return 1; } onethreefour: flag = 0; if (D1[ELM1] == ans[0]) { flag++; } if (D2[ELM1] == ans[0]) { flag++; } if (D3[ELM1] == ans[0]) { flag++; } if (D4[ELM1] == ans[0]) { flag++; } if (D5[ELM1] == ans[0]) { flag++; } if (D6[ELM1] == ans[0]) { flag++; } if (flag != 1) goto onefourfive; if (D1[ELM1] == ans[2]) { flag++; } if (D2[ELM1] == ans[2]) { flag++; } if (D3[ELM1] == ans[2]) { flag++; } if (D4[ELM1] == ans[2]) { flag++; } if (D5[ELM1] == ans[2]) { flag++; } if (D6[ELM1] == ans[2]) { flag++; } if (flag != 2) goto onefourfive; if (D1[ELM1] == ans[3]) { return 1; } if (D2[ELM1] == ans[3]) { return 1; } if (D3[ELM1] == ans[3]) { return 1; } if (D4[ELM1] == ans[3]) { return 1; } if (D5[ELM1] == ans[3]) { return 1; } if (D6[ELM1] == ans[3]) { return 1; } if (D1[ELM1] == ans[4]) { return 1; } if (D2[ELM1] == ans[4]) { return 1; } if (D3[ELM1] == ans[4]) { return 1; } if (D4[ELM1] == ans[4]) { return 1; } if (D5[ELM1] == ans[4]) { return 1; } if (D6[ELM1] == ans[4]) { return 1; } if (D1[ELM1] == ans[5]) { return 1; } if (D2[ELM1] == ans[5]) { return 1; } if (D3[ELM1] == ans[5]) { return 1; } if (D4[ELM1] == ans[5]) { return 1; } if (D5[ELM1] == ans[5]) { return 1; } if (D6[ELM1] == ans[5]) { return 1; } onefourfive: flag = 0; if (D1[ELM1] == ans[0]) { flag++; } if (D2[ELM1] == ans[0]) { flag++; } if (D3[ELM1] == ans[0]) { flag++; } if (D4[ELM1] == ans[0]) { flag++; } if (D5[ELM1] == ans[0]) { flag++; } if (D6[ELM1] == ans[0]) { flag++; } if (flag != 1) goto onefivesix; if (D1[ELM1] == ans[3]) { flag++; } if (D2[ELM1] == ans[3]) { flag++; } if (D3[ELM1] == ans[3]) { flag++; } if (D4[ELM1] == ans[3]) { flag++; } if (D5[ELM1] == ans[3]) { flag++; } if (D6[ELM1] == ans[3]) { flag++; } if (flag != 2) goto onefivesix; if (D1[ELM1] == ans[4]) { return 1; } if (D2[ELM1] == ans[4]) { return 1; } if (D3[ELM1] == ans[4]) { return 1; } if (D4[ELM1] == ans[4]) { return 1; } if (D5[ELM1] == ans[4]) { return 1; } if (D6[ELM1] == ans[4]) { return 1; } if (D1[ELM1] == ans[5]) { return 1; } if (D2[ELM1] == ans[5]) { return 1; } if (D3[ELM1] == ans[5]) { return 1; } if (D4[ELM1] == ans[5]) { return 1; } if (D5[ELM1] == ans[5]) { return 1; } if (D6[ELM1] == ans[5]) { return 1; } onefivesix: flag = 0; if (D1[ELM1] == ans[0]) { flag++; } if (D2[ELM1] == ans[0]) { flag++; } if (D3[ELM1] == ans[0]) { flag++; } if (D4[ELM1] == ans[0]) { flag++; } if (D5[ELM1] == ans[0]) { flag++; } if (D6[ELM1] == ans[0]) { flag++; } if (flag != 1) goto twothreefour; if (D1[ELM1] == ans[4]) { flag++; } if (D2[ELM1] == ans[4]) { flag++; } if (D3[ELM1] == ans[4]) { flag++; } if (D4[ELM1] == ans[4]) { flag++; } if (D5[ELM1] == ans[4]) { flag++; } if (D6[ELM1] == ans[4]) { flag++; } if (flag != 2) goto twothreefour; if (D1[ELM1] == ans[5]) { return 1; } if (D2[ELM1] == ans[5]) { return 1; } if (D3[ELM1] == ans[5]) { return 1; } if (D4[ELM1] == ans[5]) { return 1; } if (D5[ELM1] == ans[5]) { return 1; } if (D6[ELM1] == ans[5]) { return 1; } twothreefour: flag = 0; if (D1[ELM1] == ans[1]) { flag++; } if (D2[ELM1] == ans[1]) { flag++; } if (D3[ELM1] == ans[1]) { flag++; } if (D4[ELM1] == ans[1]) { flag++; } if (D5[ELM1] == ans[1]) { flag++; } if (D6[ELM1] == ans[1]) { flag++; } if (flag != 1) goto twofourfive; if (D1[ELM1] == ans[2]) { flag++; } if (D2[ELM1] == ans[2]) { flag++; } if (D3[ELM1] == ans[2]) { flag++; } if (D4[ELM1] == ans[2]) { flag++; } if (D5[ELM1] == ans[2]) { flag++; } if (D6[ELM1] == ans[2]) { flag++; } if (flag != 2) goto twofourfive; if (D1[ELM1] == ans[3]) { return 1; } if (D2[ELM1] == ans[3]) { return 1; } if (D3[ELM1] == ans[3]) { return 1; } if (D4[ELM1] == ans[3]) { return 1; } if (D5[ELM1] == ans[3]) { return 1; } if (D6[ELM1] == ans[3]) { return 1; } if (D1[ELM1] == ans[4]) { return 1; } if (D2[ELM1] == ans[4]) { return 1; } if (D3[ELM1] == ans[4]) { return 1; } if (D4[ELM1] == ans[4]) { return 1; } if (D5[ELM1] == ans[4]) { return 1; } if (D6[ELM1] == ans[4]) { return 1; } if (D1[ELM1] == ans[5]) { return 1; } if (D2[ELM1] == ans[5]) { return 1; } if (D3[ELM1] == ans[5]) { return 1; } if (D4[ELM1] == ans[5]) { return 1; } if (D5[ELM1] == ans[5]) { return 1; } if (D6[ELM1] == ans[5]) { return 1; } twofourfive: flag = 0; if (D1[ELM1] == ans[1]) { flag++; } if (D2[ELM1] == ans[1]) { flag++; } if (D3[ELM1] == ans[1]) { flag++; } if (D4[ELM1] == ans[1]) { flag++; } if (D5[ELM1] == ans[1]) { flag++; } if (D6[ELM1] == ans[1]) { flag++; } if (flag != 1) goto twofivesix; if (D1[ELM1] == ans[3]) { flag++; } if (D2[ELM1] == ans[3]) { flag++; } if (D3[ELM1] == ans[3]) { flag++; } if (D4[ELM1] == ans[3]) { flag++; } if (D5[ELM1] == ans[3]) { flag++; } if (D6[ELM1] == ans[3]) { flag++; } if (flag != 2) goto twofivesix; if (D1[ELM1] == ans[4]) { return 1; } if (D2[ELM1] == ans[4]) { return 1; } if (D3[ELM1] == ans[4]) { return 1; } if (D4[ELM1] == ans[4]) { return 1; } if (D5[ELM1] == ans[4]) { return 1; } if (D6[ELM1] == ans[4]) { return 1; } if (D1[ELM1] == ans[5]) { return 1; } if (D2[ELM1] == ans[5]) { return 1; } if (D3[ELM1] == ans[5]) { return 1; } if (D4[ELM1] == ans[5]) { return 1; } if (D5[ELM1] == ans[5]) { return 1; } if (D6[ELM1] == ans[5]) { return 1; } twofivesix: flag = 0; if (D1[ELM1] == ans[1]) { flag++; } if (D2[ELM1] == ans[1]) { flag++; } if (D3[ELM1] == ans[1]) { flag++; } if (D4[ELM1] == ans[1]) { flag++; } if (D5[ELM1] == ans[1]) { flag++; } if (D6[ELM1] == ans[1]) { flag++; } if (flag != 1) goto threefourfive; if (D1[ELM1] == ans[4]) { flag++; } if (D2[ELM1] == ans[4]) { flag++; } if (D3[ELM1] == ans[4]) { flag++; } if (D4[ELM1] == ans[4]) { flag++; } if (D5[ELM1] == ans[4]) { flag++; } if (D6[ELM1] == ans[4]) { flag++; } if (flag != 2) goto threefourfive; if (D1[ELM1] == ans[5]) { return 1; } if (D2[ELM1] == ans[5]) { return 1; } if (D3[ELM1] == ans[5]) { return 1; } if (D4[ELM1] == ans[5]) { return 1; } if (D5[ELM1] == ans[5]) { return 1; } if (D6[ELM1] == ans[5]) { return 1; } threefourfive: flag = 0; if (D1[ELM1] == ans[2]) { flag++; } if (D2[ELM1] == ans[2]) { flag++; } if (D3[ELM1] == ans[2]) { flag++; } if (D4[ELM1] == ans[2]) { flag++; } if (D5[ELM1] == ans[2]) { flag++; } if (D6[ELM1] == ans[2]) { flag++; } if (flag != 1) goto threefivesix; if (D1[ELM1] == ans[3]) { flag++; } if (D2[ELM1] == ans[3]) { flag++; } if (D3[ELM1] == ans[3]) { flag++; } if (D4[ELM1] == ans[3]) { flag++; } if (D5[ELM1] == ans[3]) { flag++; } if (D6[ELM1] == ans[3]) { flag++; } if (flag != 2) goto threefivesix; if (D1[ELM1] == ans[4]) { return 1; } if (D2[ELM1] == ans[4]) { return 1; } if (D3[ELM1] == ans[4]) { return 1; } if (D4[ELM1] == ans[4]) { return 1; } if (D5[ELM1] == ans[4]) { return 1; } if (D6[ELM1] == ans[4]) { return 1; } if (D1[ELM1] == ans[5]) { return 1; } if (D2[ELM1] == ans[5]) { return 1; } if (D3[ELM1] == ans[5]) { return 1; } if (D4[ELM1] == ans[5]) { return 1; } if (D5[ELM1] == ans[5]) { return 1; } if (D6[ELM1] == ans[5]) { return 1; } threefivesix: flag = 0; if (D1[ELM1] == ans[2]) { flag++; } if (D2[ELM1] == ans[2]) { flag++; } if (D3[ELM1] == ans[2]) { flag++; } if (D4[ELM1] == ans[2]) { flag++; } if (D5[ELM1] == ans[2]) { flag++; } if (D6[ELM1] == ans[2]) { flag++; } if (flag != 1) goto fourfivesix; if (D1[ELM1] == ans[4]) { flag++; } if (D2[ELM1] == ans[4]) { flag++; } if (D3[ELM1] == ans[4]) { flag++; } if (D4[ELM1] == ans[4]) { flag++; } if (D5[ELM1] == ans[4]) { flag++; } if (D6[ELM1] == ans[4]) { flag++; } if (flag != 2) goto fourfivesix; if (D1[ELM1] == ans[5]) { return 1; } if (D2[ELM1] == ans[5]) { return 1; } if (D3[ELM1] == ans[5]) { return 1; } if (D4[ELM1] == ans[5]) { return 1; } if (D5[ELM1] == ans[5]) { return 1; } if (D6[ELM1] == ans[5]) { return 1; } fourfivesix: flag = 0; if (D1[ELM1] == ans[3]) { flag++; } if (D2[ELM1] == ans[3]) { flag++; } if (D3[ELM1] == ans[3]) { flag++; } if (D4[ELM1] == ans[3]) { flag++; } if (D5[ELM1] == ans[3]) { flag++; } if (D6[ELM1] == ans[3]) { flag++; } if (flag != 1) goto increasecounter; if (D1[ELM1] == ans[4]) { flag++; } if (D2[ELM1] == ans[4]) { flag++; } if (D3[ELM1] == ans[4]) { flag++; } if (D4[ELM1] == ans[4]) { flag++; } if (D5[ELM1] == ans[4]) { flag++; } if (D6[ELM1] == ans[4]) { flag++; } if (flag != 2) goto increasecounter; if (D1[ELM1] == ans[5]) { return 1; } if (D2[ELM1] == ans[5]) { return 1; } if (D3[ELM1] == ans[5]) { return 1; } if (D4[ELM1] == ans[5]) { return 1; } if (D5[ELM1] == ans[5]) { return 1; } if (D6[ELM1] == ans[5]) { return 1; } increasecounter: ELM1++; } //If it is Three min return 0; } 

supprime les instructions if en les convertissant en expressions booléennes.

 flag += (DN[ELM1] == ans[0]) 

assurez-vous que vos tableaux sont dans des registres ou dans la mémoire partagée plutôt que globaux

aussi, avec un algorithme aussi simple, vous avez une logique bien trop compliquée. change la disposition des tableaux D en D [N] [6] car cela simplifiera beaucoup de choses

à propos, vous voudrez peut-être recadrer votre message un peu, beaucoup trop à lire

Exemple 3 x3

  A |0 0 0| |xx 0 D |0 0 0| -> ... -> |xx 0 -> reduce down -> |xxo| -> reduce across -> 2x |0 0 0| |xxx 

vous définissez généralement les cellules de la masortingce sur true si la correspondance A est dans le tableau D. À chaque itération, vous réduisez les colonnes à true si la totalité de la colonne est true. alors vous comptez le nombre de vrais.