when NLM_WINDOW_RADIUS is increased, the `idx` counter which indices the fWeights array, goes out of array range. see comments with //****** ```cpp __shared__ float fWeights[BLOCKDIM_X * BLOCKDIM_Y]; //****** default fWeights size is 64 const int ix = blockDim.x * blockIdx.x + threadIdx.x; const int iy = blockDim.y * blockIdx.y + threadIdx.y; //Add half of a texel to always address exact texel centers const float x = (float)ix + 0.5f; const float y = (float)iy + 0.5f; const float cx = blockDim.x * blockIdx.x + NLM_WINDOW_RADIUS + 0.5f; const float cy = blockDim.x * blockIdx.y + NLM_WINDOW_RADIUS + 0.5f; if (ix < imageW && iy < imageH) { //Find color distance from current texel to the center of NLM window float weight = 0; for (float n = -NLM_BLOCK_RADIUS; n <= NLM_BLOCK_RADIUS; n++) for (float m = -NLM_BLOCK_RADIUS; m <= NLM_BLOCK_RADIUS; m++) weight += vecLen( tex2D(texImage, cx + m, cy + n), tex2D(texImage, x + m, y + n) ); //Geometric distance from current texel to the center of NLM window float dist = (threadIdx.x - NLM_WINDOW_RADIUS) * (threadIdx.x - NLM_WINDOW_RADIUS) + (threadIdx.y - NLM_WINDOW_RADIUS) * (threadIdx.y - NLM_WINDOW_RADIUS); //Derive final weight from color and geometric distance weight = __expf(-(weight * Noise + dist * INV_NLM_WINDOW_AREA)); //Write the result to shared memory fWeights[threadIdx.y * BLOCKDIM_X + threadIdx.x] = weight; //Wait until all the weights are ready __syncthreads(); //Normalized counter for the NLM weight threshold float fCount = 0; //Total sum of pixel weights float sumWeights = 0; //Result accumulator float3 clr = {0, 0, 0}; int idx = 0; //Cycle through NLM window, surrounding (x, y) texel for (float i = -NLM_WINDOW_RADIUS; i <= NLM_WINDOW_RADIUS + 1; i++) for (float j = -NLM_WINDOW_RADIUS; j <= NLM_WINDOW_RADIUS + 1; j++) { //Load precomputed weight float weightIJ = fWeights[idx++]; //****** in this line , we go out of array //******if NLM_WINDOW_RADIUS is larger than 3. just increasing the fWeights array, does not solve ///****** the // ******problem //Accumulate (x + j, y + i) texel color with computed weight float4 clrIJ = tex2D(texImage, x + j, y + i); clr.x += clrIJ.x * weightIJ; clr.y += clrIJ.y * weightIJ; clr.z += clrIJ.z * weightIJ; //Sum of weights for color normalization to [0..1] range sumWeights += weightIJ; //Update weight counter, if NLM weight for current window texel //exceeds the weight threshold fCount += (weightIJ > NLM_WEIGHT_THRESHOLD) ? INV_NLM_WINDOW_AREA : 0; } ```