Cuda 修改基本示例VECADD以使用共享内存

Cuda 修改基本示例VECADD以使用共享内存,cuda,Cuda,我编写了以下内核,将共享内存用于基本CUDA示例vecadd两个向量之和。代码可以工作,但内核执行所用的时间与基本原始代码相同。有人能给我一个简单的方法来加速这样的代码吗 __global__ void vecAdd(float *in1, float *in2, float *out,long int len) { __shared__ float s_in1[THREADS_PER_BLOCK]; __shared__ float s_in2[THREADS_PER_BLOCK];

我编写了以下内核,将共享内存用于基本CUDA示例vecadd两个向量之和。代码可以工作,但内核执行所用的时间与基本原始代码相同。有人能给我一个简单的方法来加速这样的代码吗

__global__ void vecAdd(float *in1, float *in2, float *out,long int len) 
{
 __shared__ float s_in1[THREADS_PER_BLOCK];
 __shared__ float s_in2[THREADS_PER_BLOCK];

 unsigned int xIndex = blockIdx.x * THREADS_PER_BLOCK + threadIdx.x;

 s_in1[threadIdx.x]=in1[xIndex];
 s_in2[threadIdx.x]=in2[xIndex];

 out[xIndex]=s_in1[threadIdx.x]+s_in2[threadIdx.x];
}
有人能给我一个简单的方法来加速这样的代码吗

对于向量加法这样的操作,基本上没有有用的优化。由于计算的性质,该代码只能希望达到50%的峰值算术吞吐量,并且每个触发器需要三个内存事务,这使得该操作本质上是内存带宽受限的操作

因此,这:

__global__ void vecAdd(float *in1, float *in2, float *out, unsigned int len) 
{
 unsigned int xIndex = blockIdx.x * blockDim.x + threadIdx.x;

 if (xIndex < len) {
  float x = in1[xIndex];
  float y = in2[xIndex];
  out[xIndex] = x + y;
 }
}

使用共享内存无法加速这样的代码。矢量加法只需要每个元素读或写一次。没有数据重用,也没有跨线程的数据共享。共享内存没有帮助。如果你能正确格式化你的代码也会很好。谢谢你的快速回复。我正确地格式化了代码。有没有其他替代共享内存的解决方案?
  int minGrid, minBlockSize;
  cudaOccupancyMaxPotentialBlockSize(&minGrid, &minBlockSize, vecAdd);
  int nblocks = (len / minBlockSize) + ((len % minBlockSize > 0) ? 1 : 0);
  vecAdd<<<nblocks, minBlockSize>>>(x, y, z, len);