Могу ли я улучшить следующую функцию в CUDA
?
Что делает функция,
Учитывая min
и max
, ELM1
и ELM
, проверьте, найдены ли какие-либо три числа массива ans[6]
в любой строке, от min
до max
, в массиве D1
> , D2
, D3
, D4
, D5
, D6
, если найдено return 1.
Я пробовал использовать loops
, OR
-ing, AND
-ing, заменяя goto
флагом и т.д. и т.д. Но это, по-видимому, самый быстрый способ.
__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;
}