2010-06-10 55 views
0

我可以在CUDA下改進以下功能嗎?如何在CUDA下改進此功能?

函數的功能是,

給定一個minmaxELM1ELM,檢查數組ans[6]的任何三個號碼中的任何行被發現,從minmax,在陣列D1D2D3D4D5D6,如果發現返回1

我試着用loopsOR -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; 


} 
+0

在perl中編寫生成器(選擇你的語言)並在一天內調用它? ;) – 2010-06-10 19:07:21

回答

1

通過將它們轉換爲布爾表達式來刪除if語句。

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

確保您的陣列中的寄存器或共享內存而不是全球

還,就這麼簡單的算法,你有太複雜的邏輯。 d陣列的變化佈局中D [N] [6],因爲它會簡化很多事情

順便說一下,你可能要裁剪您的文章一點點,太多閱讀

3 X3例如

 A 
    |0 0 0|   |x x 0 
D |0 0 0| -> ... -> |x x 0 -> reduce down -> |x x o| -> reduce across -> 2x 
    |0 0 0|   |x x x 

基本上你基質細胞設置爲真,如果匹配A是在每次減少列爲true,如果整個列是真迭代的數組D. 。 然後你算真數。

+0

好吧,D1 ... D6數組是恆定的,這似乎比共享更快。隨着D [N] [6]會更復雜,我試了一下,速度更慢。 – Mark 2010-06-11 00:25:34

+0

帶標誌+ =(DN [ELM1] == ans [0])需要700 ms以上 – Mark 2010-06-11 00:46:02

+0

@標記您使用多少個線程? – Anycorn 2010-06-11 01:26:38