¿Cómo es que aumentar el valor de Na da un resultado erróneo?

La respuesta simple es que lo más probable es que haya excedido las dimensiones del bloque y agrupado incorrectamente demasiados hilos por bloque. El número máximo de subprocesos por bloque varía según la arquitectura de la GPU. El máximo actual, que yo sepa, es 1024. Este valor varía según la GPU.

Por lo tanto, puede asignar 1024 hilos a MAX a un bloque. Más que eso excedería los límites. Esto es lo que sucede en su código cuando Na excede 1024. Parece que está usando Na como las dimensiones del bloque.

Para comprender mejor esta respuesta, necesitamos saber lo siguiente

1) Comprender cómo se inicia y ejecuta un núcleo.
2) La GPU nVidia de destino en la que está intentando ejecutar su código

Mantendré mi respuesta breve, así que discutiré los puntos clave.

CUDA lanza múltiples subprocesos para calcular de manera SPMD (programa único, datos múltiples), es decir, varios subprocesos tienen la misma secuencia de instrucciones EXACT, pero operan con datos diferentes. Este programa o secuencia de ejecución se define en el Kernel. Un núcleo se “inicia” en una GPU para su ejecución. (Técnicamente no se puede “llamar” un kernel, se inicia un kernel. Se pueden invocar funciones / métodos. Un kernel no es exactamente una función. Es muy diferente, pero hoy nos saltaremos los tecnicismos).

Cuando estos hilos se “lanzan”, se agrupan en una estructura definida llamada “cuadrícula”.

Puede visualizar la cuadrícula en 2D como filas y columnas de una matriz. Cada elemento en esta matriz que representa la cuadrícula NO es un hilo, sino que una cuadrícula se compone de varios “bloques”. Cada bloque a su vez es una colección de hilos.
También puede visualizar cada bloque como una matriz, donde cada elemento es un hilo.

Se ve algo como esto:

Documentación del kit de herramientas de CUDA

Ahora aquí está la parte importante.
a) Existe un límite en el número total de subprocesos que pueden ejecutarse en la GPU simultáneamente.
b) Hay un límite en el número de bloques que se pueden ejecutar en un instante
c) Hay un límite en el número total de hilos por bloque

También,
En realidad, la cuadrícula es una estructura 3D, y también lo es el bloque. Para que pueda organizar sus hilos como quiera. 1D, 2D o 3D, siempre que el número total de hilos por bloque esté dentro del límite.

Las restricciones en las dimensiones y tamaños de cuadrículas y bloques son específicas y exclusivas de una familia (arquitectura) de GPU. Varía entre las GPU, debe verificar esto.

Ahora, lanzando un kernel:

Se lanza un núcleo como:

KernelName <> (arg1, arg2);

En su caso, utilizó un único valor entero para describir las dimensiones de la cuadrícula. (Si bien esto puede funcionar a veces, es una mala práctica). Estableció la dimensión de la cuadrícula en 2 y la dimensión del bloque en Na, que era 1024.
Entonces lanzaste 2 bloques de 1024 hilos cada uno.
Cuando aumenta Na a 1025, viola el número máximo de hilos de bloqueo. Variando las dimensiones de la cuadrícula no ayudará.

Una mejor manera de usar su código sería usar la estructura dim3.
P.ej.

bloque dim3, cuadrícula;

grid.x = 2;
grid.y = 1;
grid.z = 1;

bloque.x = Na;
bloque.y = 1;
bloque.z = 1;

makingWindow <> (d_window, d_windowz, noZeros);

Hasta el último punto. Averigua qué es compatible con tu GPU. Hay formas fáciles de hacer esto.

1) Encuentra el número de modelo de tu GPU. Por ejemplo, GeForce GTX660 o GTX780 o Tesla K10, etc.
Luego, descubra cuál es la “capacidad de cálculo” de su GPU.
Descubra los límites en bloques y dimensiones de cuadrícula para esa capacidad de cálculo.
Puede encontrar la mayor parte de la información en wikipedia:

2) La forma más fácil es instalar los ejemplos de SDK de CUDA y ejecutar el programa de ejemplo “deviceQuery”. Esto le dirá TODO lo que necesita saber.

Si está confundido por todo esto, le sugiero que se tome unas horas para revisar algunos tutoriales introductorios de CUDA o lea los primeros capítulos de un libro de CUDA para su revisión.

¡Buena suerte!