【发布时间】:2014-10-20 14:01:50
【问题描述】:
我正在尝试学习共享内存的用法,以提高性能。在这里,我试图将全局内存复制到共享内存。但是当我有单个块(256 个线程)时,它会给出结果,并且超过 1 个块会给出随机结果。
#include <cuda.h>
#include <stdio.h>
__global__ void staticReverse(int *d, int n)
{
__shared__ int s[400];
int t = blockIdx.x * blockDim.x + threadIdx.x;
d[t] = d[t]*d[t];
s[t] =d[t];
__syncthreads();
d[t] = s[t];
}
__global__ void dynamicReverse(int *d, int n)
{
extern __shared__ int s[];
int t = threadIdx.x;
s[t] = d[t]*d[t];
__syncthreads();
d[t] = s[t];
}
int main(void)
{
const int n = 400;
int a[n], d[n];
for (int i = 0; i < n; i++)
{
a[i] = i;
}
int *d_d;
cudaMalloc(&d_d, n * sizeof(int));
// run version with static shared memory
int block_size = 256;
int n_blocks = n/block_size + (n%block_size == 0 ? 0:1);
cudaMemcpy(d_d, a, n*sizeof(int), cudaMemcpyHostToDevice);
staticReverse<<<n_blocks,block_size>>>(d_d, n);
cudaMemcpy(d, d_d, n*sizeof(int), cudaMemcpyDeviceToHost);
for (int i = 0; i < n; i++)
{
printf("%d\n",d[i]);
}
}
1)dynamicReverse<<<n_blocks,block_size,n*sizeof(int)>>>(d_d, n); 中的第三个参数是什么
内核调用呢?它是否为整个块或线程分配共享内存。
2) 如果在计算能力 5.0 中我需要每个多处理器超过 64kb 的共享内存,我需要做什么?
【问题讨论】:
标签: cuda shared-memory