我有一个程序来计算数组的值: 数组A:有32个元素,值形式0 - > 31。 数组B:有16个元素,值= 0;
**我想按照这条规则计算B [i]的值:B [i] = A [i * 2] + A [i * 2 + 1];我从0到31 ** 我使用CUDA编程和我的示例代码:
Main.cu
__global__ void Kernel(int *devB, int *devA)
{
// Use share memory, 16 thread per block, so I use 16element for share memory in block
__shared__ int smA[16];
//copy data from global memory to shared memory
//1 thread copies 1 elementente
smA[threadIdx.x] = devA[threadIdx.x + blockIdx.x * blockDim.x];
__syncthreads();
//8 thread in Block
if (threadIdx.x < 8)
{
devB[threadIdx.x + blockIdx.x * blockDim.x] =
smA[threadIdx.x * 2] + smA[threadIdx.x * 2 + 1];
}
}
Void main
void main()
{
int *A = (int*)malloc(sizeof(int) * 32);
int *B = (int*)malloc(sizeof(int) * 16);
for (int i = 0; i < 32; i++)
A[i] = i;
int *devA = NULL;
cudaMalloc((void**)&devA, sizeof(int) * 32);
cudaMemcpy(devA, A, sizeof(int) * 32), cudaMemcpyHostToDevice);
int * devB = NULL;
cudaMalloc((void**)&devB, sizeof(int) * 16);
dim3 block(16, 1, 1);
dim3 grid(2, 1, 1);
Kernel<<<grid, block>>>(devB, devA);
//copy back data to host
cudaMemcpy(B, devB, sizeof(int) * 16, cudaMemcpyDeviceToHost);
for (int i = 0; i < 16; i++) printf("%d/t", b[i]);
if (A != NULL) free(A);
if (B != NULL) free(B);
if (devA != NULL) cudaFree(devA);
if (devB != NULL) cudaFree(devB);
}
所以,我想问一下:按照上面的代码,我在内核中使用共享内存 int smnA [16],并使用2 block = 2 * 16线程因为每个线程执行一个内核(来自Seland.pdf) =&GT;我将在共享内存中使用16x16 = 256元素? =&GT;没有逻辑!
答案 0 :(得分:1)
不,你的假设是错误的。因为共享内存可以用于同一块内的线程的交互,所以也为整个线程块分配共享内存。 在您的示例中,您将为每个线程块使用16个整数元素。您的内核总共需要32个整数元素来同时运行所有线程块。 即使它不相同,但也许你可以将它与c代码中的静态变量进行比较。
如果你在你的内核中写下类似下面的代码示例,那么每个线程都将使用它拥有16个元素的自己的数组。但是这个数组不能被其他线程访问(异常将是shuffle指令)。
__globa__ void kernel (...)
{
int array_single_thread[16]; // Every thread instance has it's own array.
...
__shared__ int array_thread_block[16]; // Once allocated for complete thread block.
}