2010-12-14 8 views
1

나는 반복을위한 pxq 행렬에 대해 Conway의 GOL의 실행에서 만들어 질 전이 수를 계산하려고한다. 예를 들어 초기 상태가 1 개의 깜박임 (아래 참조) 인 1 번의 반복이 주어집니다. 5 전환 (2 출생, 1 생존, 과소 인구에서 2 사망) 것입니다. 이미이 작업을 수행하고 있지만이 논리를 CUDA를 사용하여 실행하고 싶습니다. 아래는 CUDA로 포팅하고 싶습니다.conway의 삶의 게임을위한 쿠다 커널

alt text 코드 :

static void gol() // call this iterations x's 
    { 
     int[] tempGrid = new int[rows * cols]; // grid holds init conditions 
     for (int i = 0; i < rows; i++) 
     { 
      for (int j = 0; j < cols; j++) 
      { 
       tempGrid[i * cols + j] = grid[i * cols + j]; 
      } 
     } 

     for (int i = 0; i < rows; i++) 
     { 
      for (int j = 0; j < cols; j++) 
      { 
       int numNeighbors = neighbors(i, j); // finds # of neighbors 

       if (grid[i * cols + j] == 1 && numNeighbors > 3) 
       { 
        tempGrid[i * cols + j] = 0; 
        overcrowding++; 
       } 
       else if (grid[i * cols + j] == 1 && numNeighbors < 2) 
       { 
        tempGrid[i * cols + j] = 0; 
        underpopulation++; 
       } 
       else if (grid[i * cols + j] == 1 && numNeighbors > 1) 
       { 
        tempGrid[i * cols + j] = 1; 
        survival++; 
       } 
       else if (grid[i * cols + j] == 0 && numNeighbors == 3) 
       { 
        tempGrid[i * cols + j] = 1; 
        birth++; 
       } 
      } 
     } 

     grid = tempGrid; 
    } 
+0

특별히 도움이 필요한 것은 무엇입니까? - 병렬화 방법, 저장 방법, 실제 CUDA 프로그래밍 등 ? – Rup

+0

죄송합니다. 어떻게 병렬 처리에 접근해야합니까? – dnbwise

답변

3

주요 둔화 메인 메모리 액세스가 될 것입니다 다시 자신의 결과를 기록, 공유 메모리

  • 의 내용을 기반으로 생존 계산을 할 수 있습니다. 그래서 당신은 당신이 사용할 수있는 하드웨어를 기반으로 largish 스레드 블록 크기를 선택하는 것이 좋습니다. 256 (16x16)은 하드웨어 간 호환성을 고려한 좋은 선택입니다. 각 스레드 블록은 보드의 약간 더 작은 섹션에 대한 결과를 계산할 것입니다. 16x16을 사용하면 요소 테두리가 하나이므로 보드의 14x14 섹션에 대한 결과가 계산됩니다. (16x16 블록을 사용하여 16x16 청크 대신 14x14 청크를 계산하는 이유는 메모리 읽기 병합을위한 것입니다.)

    보드를 14x14 청크로 나누십시오. 즉 당신이 적합 볼 수 있지만, 가장 가능성이 뭔가, board_width/14처럼 board_height/14. 커널 내에서

    가 공유 메모리에 그 요소를 각 스레드를로드 한 그러나 조직 그리드 (입니다. 그런 다음 syncthreads는. 그리고 중간의 14x14 요소는 새를 계산해야 값을 공유 메모리에 저장된 값을 사용하여 전역 메모리로 다시 쓰기 공유 메모리를 사용하면 전역 읽기 및 쓰기를 최소화하는 데 도움이됩니다. 또한 스레드 블록 크기를 가능한 한 커야합니다. 모서리는 전역 메모리 액세스를 낭비합니다. 그 이유는 가져온 값이 9 번이 아니라 1 ~ 3 번 사용되기 때문입니다.

  • 0

    여기 하나의 방법 진행할 수 :

    1. 각 스레드는
    2. 각 스레드가 처음로드까지 하나 개의 요소에서 그리드의 한 요소에 대한 계산을한다 메인 그리드를 공유 메모리에 저장
    3. 스레드 블록의 가장자리에있는 스레드는 경계 요소를로드해야합니다 국세청
    4. 각 스레드는 각 스레드가 다음 메인 메모리