2010-06-05 2 views
2

그림에서 Histogram 용 CUDA 커널을 작성하고 있지만 커널에서 배열을 반환하는 방법을 모르고 있었고 다른 스레드가 읽을 때 배열이 변경됩니다. 그것을위한 가능한 해결책?CUDA 히스토그램 커널을 만드는 방법은 무엇입니까?

__global__ void Hist(
    TColor *dst, //input image 
    int imageW, 
    int imageH, 
int*data 
){ 
    const int ix = blockDim.x * blockIdx.x + threadIdx.x; 
    const int iy = blockDim.y * blockIdx.y + threadIdx.y; 

if(ix < imageW && iy < imageH) 
{ 
    int pixel = get_red(dst[imageW * (iy) + (ix)]); 
        //this assign specific RED value of image to pixel 

    data[pixel] ++; // ?? problem statement ... 
} 
} 

@para d_dst : 입력 이미지 TColor는 float4와 동일합니다.

@para 데이터 (또는 일반적으로 GPGPU)와 CUDA로 구현 될 때 [255]

extern "C" void 
cuda_Hist(TColor *d_dst, int imageW, int imageH,int* data) 
{ 
    dim3 threads(BLOCKDIM_X, BLOCKDIM_Y); 
    dim3 grid(iDivUp(imageW, BLOCKDIM_X), iDivUp(imageH, BLOCKDIM_Y)); 
    Hist<<<grid, threads>>>(d_dst, imageW, imageH, data); 
} 

답변

5

SDK 샘플을 보았습니까? "히스토그램"샘플은 CUDA SDK (현재 NVIDIA developer site의 버전 3.0, 버전 3.1 베타는 registered developers에서 사용 가능)에서 사용할 수 있습니다.

샘플 문서는 GPU에서 전역 메모리 원자를 사용하거나 각 블록에 대한 결과를 개별적으로 수집 한 다음 별도의 축소 (호스트 또는 GPU에서)를 수행하여 합계를 처리하는 방법을 잘 설명합니다.

2

히스 토 그래밍 특히 효율적이지 히스토그램 크기 어레이 - 일반적으로는있는 부분 히스토그램을 많이 생성 할 필요 공유 메모리에 저장 한 다음 합계하십시오. 이 특정 작업을 CPU에 유지하는 것이 좋습니다.

+0

그러나 내 과제는 CUDA를 사용하여 히스토그램을 적용 해보는 것입니다. 그리고 나는 그것을 끝낼 수 없다. 데이터가 단일성을 달성 할 수는 없다. – kitw

0

동일한 메모리를 사용하는 다른 스레드를 차단하려면 원자 함수를 사용하거나 부분 히스토그램을 사용해야합니다. 어느 쪽이든 입력 이미지가 매우 큰 경우가 아니면 효율적이지 않습니다.

관련 문제