CUDA에서 이미지 서브 샘플러를 작성하고 스레드를 사용하여 평균화 작업을 수행합니다. 그러나 커널을 호출하지 않고이 작업을 수행하면 실제로 CUDA 커널을 호출 할 때보 다 훨씬 빠르게 실행됩니다. 이미지 크기는 지금 1280x1024입니다. 커널 호출은 보통 상당한 시간이 걸리거나 구현에 문제가 있습니까?CUDA 버전이 CPU 버전보다 느립니다?
피씨 나는 코드를 제거한 상태에서 커널을 호출 해 보았습니다. 코드가있는 커널과 거의 같은 시간이었습니다. 또한 커널 호출이 없으면 내 코드는 약 350ms를 실행하지만 커널 호출은 1000ms에 가깝습니다.
__global__ void subsampler(int *r_d,int *g_d,int *b_d, int height,int width,int *f_r,int*f_g,int*f_b){
int id=blockIdx.x * blockDim.x*blockDim.y+ threadIdx.y*blockDim.x+threadIdx.x+blockIdx.y*gridDim.x*blockDim.x*blockDim.y;
if (id<height*width/4){
f_r[id]=(r_d[4*id]+r_d[4*id+1]+r_d[4*id+2]+r_d[4*id+3])/4;
f_g[id]=(g_d[4*id]+g_d[4*id+1]+g_d[4*id+2]+g_d[4*id+3])/4;
f_b[id]=(b_d[4*id]+b_d[4*id+1]+b_d[4*id+2]+b_d[4*id+3])/4;
}
}
나는 blockSizeX 및 blockSizeY 1 1 (내가 그들 4,16 만드는 시도)하지만, 어떻게 든이 가장 빠른
dim3 blockSize(blocksizeX,blocksizeY);
int new_width=img_width/2;
int new_height=img_height/2;
int n_blocks_x=new_width/blocksizeX+(new_width/blocksizeY == 0 ?0:1);
int n_blocks_y=new_height/blocksizeX+(new_height/blocksizeY == 0 ?0:1);
dim3 gridSize(n_blocks_x,n_blocks_y);
하고 그때 gridSize, 블록 크기 커널 호출로 정의합니다.
몇 개의 스레드/블록이 있습니까? if()를 제거 할 수있는 스레드의 수를 지정하지 않는 이유는 무엇입니까? –
스레드/블록에 대해 위에서 편집했습니다. 나는 'if'를 제거하고 퍼포먼스를 상하게하는 방법을 확신 할 수 없다. (왜냐하면 성능을 측정하여 빈 커널을 호출하고 거의 같은 시간이 걸리기 때문이다.) – Manish
글쎄 또 다른 간단한 프로그램을 추가했다. 2 배열 및 그 또한 CPU 버전 스레드를 GPU 버전보다 빠르게 수행 할 것 같습니다. – Manish