Полагаю, вы обнаружили опечатку на слайдах (вероятно, это должно быть что-то вроде while(i + blockDim.x < n)
).
Если вы посмотрите на исходный код в примере CUDA SDK "сокращение" , тело самого последнего reduce6
будет выглядеть следующим образом:
template <class T, unsigned int blockSize, bool nIsPow2>
__global__ void
reduce6(T *g_idata, T *g_odata, unsigned int n)
{
T *sdata = SharedMemory<T>();
// perform first level of reduction,
// reading from global memory, writing to shared memory
...
T mySum = 0;
// we reduce multiple elements per thread. The number is determined by the
// number of active thread blocks (via gridDim). More blocks will result
// in a larger gridSize and therefore fewer elements per thread
while (i < n)
{
mySum += g_idata[i];
// ensure we don't read out of bounds -- this is optimized away for powerOf2 sized arrays
if (nIsPow2 || i + blockSize < n)
mySum += g_idata[i+blockSize];
i += gridSize;
}
Обратите внимание на явную проверку в while
, которая запрещает неограниченный доступ к g_idata
. Ваше первоначальное подозрение верно; n
- это просто размер массива g_idata
.