【发布时间】:2011-03-02 08:22:02
【问题描述】:
CUDA下面的功能可以改进吗?
函数的作用是,
给定一个min和max、ELM1和ELM,检查数组@987654329的任意一行中是否存在任意三个数组ans[6],从min到max,在数组@987654329中@、D2、D3、D4、D5、D6,如果找到返回 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;
}
【问题讨论】:
-
用 perl 编写生成器(选择您的语言)并收工? ;)
标签: c optimization cuda