방금 CUDA로 시작했습니다. 이제 나는 질문이있다. N * N 행렬이 있고 창 크기는 8x8입니다. 이 행렬을 여러 개의 부분 행렬로 세분화하고이 최대 값을 찾으십시오. 예를 들어 64 * 64 행렬을 가지고 있으므로 8 * 8 크기의 8 개의 작은 행렬을 가지며 8 개의 최대 값을 찾습니다. 마지막으로 모든 최대 값을 새 배열에 저장하지만 순서는 항상 변경됩니다. 내가 바로 순서대로 유지하는 해결책을 찾기 원하는 것은CUDA에서 최대 행렬 찾기
__global__ void calculate_emax_kernel(float emap[],float emax[], int img_height, int img_width,int windows_size)
{
int x_index = blockIdx.x*blockDim.x+threadIdx.x;
int y_index = blockIdx.y*blockDim.y+threadIdx.y;
int num_row_block = img_height/windows_size;
int num_col_block = img_width/windows_size;
__shared__ float window_elements[256];
__shared__ int counter;
__shared__ int emax_count;
if (threadIdx.x == 0) emax_count = 0;
__syncthreads();
int index;
int emax_idx = 0;
if(y_index >= img_height|| x_index >= img_width) return;
for(int i = 0; i < num_row_block; i++)
{
for(int j = 0; j < num_col_block; j++)
{
counter = 0;
if(y_index >= i*windows_size && y_index < (i+1)*windows_size
&& x_index >= j*windows_size && x_index < (j+1)*windows_size)
{
int idx = y_index*img_height + x_index;
index = atomicAdd(&counter, 1);
window_elements[index] = emap[idx];
__syncthreads();
// reduction
unsigned int k = (windows_size*windows_size)/2;
while(k != 0)
{
if(index < k)
{
window_elements[index] = fmaxf(window_elements[index], window_elements[index+k]);
}
k /= 2;
}
if(index == 0)
{
emax[i*num_row_block+j] = window_elements[index];
}
}
__syncthreads();
}
__syncthreads();
}
__syncthreads();
}
이 내 구성 CUDA와
void construct_emax(float *input,float *output, int img_height, int img_width)
{
int windows_size = 4;
float * d_input, * d_output;
cudaMalloc(&d_input, img_width*img_height*sizeof(float));
cudaMalloc(&d_output, img_width*img_height*sizeof(float));
cudaMemcpy(d_input, input, img_width*img_height*sizeof(float), cudaMemcpyHostToDevice);
dim3 blocksize(16,16);
dim3 gridsize;
gridsize.x=(img_width+blocksize.x-1)/blocksize.x;
gridsize.y=(img_height+blocksize.y-1)/blocksize.y;
calculate_emax_kernel<<<gridsize,blocksize>>>(d_input,d_output,img_height,img_width,windows_size);
}
"8x8 크기의 8x8 크기의 작은 행렬을 가지고 8x8 최대 값을 찾으십니까?"라는 뜻입니까? – kangshiyin
@kangshiyin 미안하다. 설명하기 어렵다. 입력 행렬을 몇 개의 작은 행렬로 나눌 것인데, 이는 창 크기에 달려있다. 예를 들어, 16 * 16 행렬 및 8 * 8 창 크기가 있으면 4 개의 작은 행렬을 갖게됩니다. 그리고 각 작은 행렬의 최대 값을 찾아라. –
그리드/블록 구성이란 무엇입니까? – kangshiyin