Interpretación de "demasiados recursos para el lanzamiento"

Considere el siguiente código de Python:

from numpy import float64
from pycuda import compiler, gpuarray
import pycuda.autoinit

# N > 960 is crucial!
N = 961
code = """
__global__ void kern(double *v)
{
    double a = v[0]*v[2];
    double lmax = fmax(0.0, a), lmin = fmax(0.0, -a);
    double smax = sqrt(lmax),   smin = sqrt(lmin);

    if(smax > 0.2) {
        smax = fmin(smax, 0.2)/smax ;
        smin = (smin > 0.0) ? fmin(smin, 0.2)/smin : 0.0;
        smin = lmin + smin*a;

        v[0] = v[0]*smin + smax*lmax;
        v[2] = v[2]*smin + smax*lmax;
    }
}
"""
kernel_func = compiler.SourceModule(code).get_function("kern")
kernel_func(gpuarray.zeros(3, float64), block=(N,1,1))

Ejecutar esto da:

Traceback (most recent call last):
  File "test.py", line 25, in <module>
    kernel_func(gpuarray.zeros(3, float64), block=(N,1,1))
  File "/usr/lib/python3.5/site-packages/pycuda/driver.py", line 402, in function_call
    func._launch_kernel(grid, block, arg_buf, shared, None)
pycuda._driver.LaunchError: cuLaunchKernel failed: too many resources requested for launch

Mi configuración: Python v3.5.2 con pycuda == 2016.1.2 y numpy == 1.11.1 en Ubuntu 16.04.1 (64 bits), kernel 4.4.0, nvcc V7.5.17. La tarjeta gráfica es una Nvidia GeForce GTX 480.

¿Puedes reproducir esto en tu máquina? ¿Tienes alguna idea de qué causa este mensaje de error?

Observación: Sé que, en principio, hay una condición de carrera porque todos los núcleos intentan cambiar v [0] y v [2]. ¡Pero los núcleos no deberían alcanzar el interior del bloque if de todos modos! Además, puedo reproducir el error sin la condición de carrera, pero es mucho más complicado.

Respuestas a la pregunta(1)

Su respuesta a la pregunta