2012-09-15 5 views
1

4 점 스텐실 OpenCL 코드에 문제가 있습니다. 코드는 잘 실행되지만 예상되는 symetrics 최종 2D 값을 얻지 못합니다.OpenCL 스텐실 코드 문제

커널 코드의 업데이트 값에 문제가 있다고 생각됩니다. 다음은 커널 코드입니다.

// kernel code 

const char *source ="__kernel void line_compute(const double diagx, const double diagy,\ 
const double weightx, const double weighty, const int size_x,\ 
__global double* tab_new, __global double* r)\ 
{ int iy = get_global_id(0)+1;\ 
    int ix = get_global_id(1)+1;\ 
    double new_value, cell, cell_n, cell_s, cell_w, cell_e;\ 
    double rk;\ 
    cell_s = tab_new[(iy+1)*(size_x+2)+ix];\ 
    cell_n = tab_new[(iy-1)*(size_x+2)+ix];\ 
    cell_e = tab_new[iy*(size_x+2)+(ix+1)];\ 
    cell_w = tab_new[iy*(size_x+2)+(ix-1)];\ 
    cell  = tab_new[iy*(size_x+2)+ix];\ 
    new_value = weighty *(cell_n + cell_s + cell*diagy)+\ 
         weightx *(cell_e + cell_w + cell*diagx);\ 
    rk = cell - new_value;\ 
    r[iy*(size_x+2)+ix] = rk *rk;\ 
    barrier(CLK_GLOBAL_MEM_FENCE);\ 
    tab_new[iy*(size_x+2)+ix] = new_value;\ 
}"; 

cell_s, cell_n, cell_e, cell_w는 2D 스텐실의 4 가지 값을 나타냅니다. new_value를 계산하고 "barrier(CLK_GLOBAL_MEM_FENCE)" 다음에 업데이트합니다.

그러나, 그것 differents 작업 항목 간의 충돌이 보인다. 어떻게 해결할 수 있을까요?

답변

2

사용하는 장벽 GLOBAL_MEM_FENCE는 이 아니며은 의도 한대로 모든 작업 항목을 동기화합니다. 하나의 작업 그룹과 만 액세스를 동기화합니다. 그들은 물리적 코어의 작은 번호를 예정하고 글로벌 동기화가 커널 내에서 가능하지 않기 때문에

는 일반적으로 모든 작업이 동시에 실행되지 않습니다.

해결책은 출력을 다른 버퍼에 쓰는 것입니다.