2010-06-10 4 views
0

CUDA 아래에서 다음 기능을 향상시킬 수 있습니까? minmax, ELM1ELM, 배열 ans[6]의 세 개의 숫자가 배열 D1, D2에, min에서 max에, 어떤 행에서 발견되는 경우 확인 D3 감안할 때 함수가되어 무엇을CUDA에서 어떻게이 기능을 개선 할 수 있습니까?

,

, D4, D5, D6, 내가 loops, OR -ing, AND -ing를 사용하여 시도 발견 반환 1.

경우, 담당자 깃발 등으로 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로 작성하고 (언어 선택) 하루로 전화하나요? ;) –

답변

1

if 문을 부울 식으로 변환하여 제거합니다.

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

은 배열이 레지스터에 있는지 확인하거나 너무 복잡한 로직을 가지고 같은 간단한 알고리즘에, 또한

세계보다는 메모리를 공유했다. D 배열의 레이아웃 변경은 [N] [6]은 여러 가지

, 당신은 귀하의 게시물을 조금 잘라내 할 수 있습니다 그런데

을 단순화하므로, 너무 많은

3 X3를 읽을 D합니다 경기 A가 전체 열이 true 인 경우 true로 열을 감소 각각의 반복에 배열 D. 에있는 경우

 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 

은 기본적으로 true로 매트릭스 세포를 설정한다. 그 다음 참의 수를 세십시오.

+0

글쎄, D1 ... D6 배열은 일정하며 공유보다 빠른 것 같습니다. D [N] [6]가 더 복잡해지기 때문에 노력했지만 느린 편입니다. – Mark

+0

플래그 + = (DN [ELM1] == ans [0])이 700ms 이상 걸린다 – Mark

+0

@Mark 얼마나 많은 쓰레드를 사용하고 있습니까? – Anycorn

관련 문제