Cuda는 공유 메모리가 동일한 블록의 데이터로만 공유 될 수 있다고 말했다. 그러나 블록에는 최대 1024 개의 스레드 만있을 수 있습니다. 거대한 행렬을 가지고 있고 최대화 된 스레드로 평균을 취하고 싶습니다.블록 단위로 평균을 취함 Cuda
예를 들어 설명합니다. 나는 4 개 개의 블록을 만들
#include <iostream>
#include <stdio.h>
__global__ void
kernel(int *a, int dimx, int dimy)
{
int ix = blockDim.x * blockIdx.x + threadIdx.x;
int iy = blockDim.y * blockIdx.y + threadIdx.y;
int idx = iy * dimx + ix;
__shared__ int array[64];
a[idx] = a[idx] + 1;
array[idx] = a[idx];
__syncthreads();
int sum=0;
for(int i=0; i<dimx*dimy; i++)
{
sum += array[i];
}
int average = sum/(dimx*dimy+1.0f);
a[idx] = average;
}
int
main()
{
int dimx = 8;
int dimy = 8;
int num_bytes = dimx*dimy*sizeof(int);
int *d_a=0, *h_a=0; // device and host pointers
h_a = (int*)malloc(num_bytes);
for (int i=0; i < dimx*dimy; i++){
*(h_a+i) = i;
}
cudaMalloc((void**)&d_a, num_bytes);
//cudaMemset(d_a, 0, num_bytes);
cudaMemcpy(d_a, h_a, num_bytes, cudaMemcpyHostToDevice);
dim3 grid, block;
block.x = 4;
block.y = 4;
grid.x = dimx/block.x;
grid.y = dimy/block.y;
kernel<<<grid, block>>>(d_a, dimx, dimy);
cudaMemcpy(h_a, d_a, num_bytes, cudaMemcpyDeviceToHost);
std::cout << "the array a is:" << std::endl;
for (int row = 0; row < dimy; row++)
{
for (int col =0; col < dimx; col++)
{
std::cout << h_a[row * dimx + col] << " ";
}
std::cout << std::endl;
}
free(h_a);
cudaFree(d_a);
}
(난 그냥 데모로, 한 블록의 최대 스레드를 사용하지 않았다), 그리고 그들 모두의 평균으로 결과를 원한다. 이제 결과는 다음과 같습니다.
the array a is:
3 3 3 3 4 4 4 4
3 3 3 3 4 4 4 4
3 3 3 3 4 4 4 4
3 3 3 3 4 4 4 4
11 11 11 11 12 12 12 12
11 11 11 11 12 12 12 12
11 11 11 11 12 12 12 12
11 11 11 11 12 12 12 12
각 블록의 평균은 오히려 전체 평균입니다. 모든 블록에 대해 평균을 취하는 방법은 무엇입니까?
저는 Cuda를 처음 사용합니다. 모든 관련 답변을 환영합니다.
CUDA SDK의 축소 예제 중 하나를보고 이런 종류의 작업이 수행되는지 확인하십시오. –