cuda error de ECC incorregible encontrado

Mi entorno es

Windows 7 x64Matlab 2012a x64Cuda SDK 4.2Tesla C2050 GPU

Estoy teniendo problemas para entender por qué mi GPU está fallando con el "error ECC incorregible encontrado". Este error solo ocurre cuando uso 512 hilos o más. No puedo publicar el kernel, pero intentaré describir lo que hace.

En general, el núcleo toma una serie de parámetros y produce 2 matrices complejas definidas por el tamaño del hilo, M y otro número, N. Por lo tanto, las matrices devueltas serán de tamaño MxN. Una configuración típica es 512x512, pero cada número es independiente y puede variar hacia arriba o hacia abajo. El núcleo funciona cuando los números son 256x256.

Cada subproceso (núcleo) extrae un vector de tamaño 999 de una matriz 2D en función de la identificación del subproceso, es decir, el tamaño 999xM, luego recorre la fila (0 .. N-1) de las matrices de salida para el cálculo. Se calculan varios parámetros intermedios, solo utilizando pow, sin y cos entre los+ - * / operadores Para calcular una de las matrices de salida, se debe ejecutar un bucle adicional para resumir la contribución del vector 999 que se extrajo anteriormente. Este bucle realiza algunos cálculos intermedios para determinar un rango de valores que permitirá la contribución. Luego, la contribución se escala según un factor determinado por los valores cos y seno de un valor fraccional calculado. Aquí es donde se estrella. Si me quedo en un valor constante o 1.0 o cualquier otro, el kernel se ejecuta sin problemas. sin embargo, cuando solo se incluye una de las llamadas (cos o seno), el núcleo se bloquea.

Algunos psuedocode sigue:

kernel()
{

/* Extract 999 vector from 2D array 999xM - one 999 vector for each thread. */
for (int i = 0; i < 999; i++)
{
    .....
}

/* Cycle through the 2nd dimension of the output matricies */
for (int j = 0; j < N; j++)
{
    /* Calculate some intermediate variables */

    /* Calculate the real and imaginary components of the first output matrix */
    /* real = cos(value), imaginary = sin(value) */

    /* Construct the first output matrix from some intermediate variables and the real and imaginary components */

    /* Calculate some more intermediate variables */

    /* cycle through the extracted vector (0 .. 998) */
    for (int k = 0; k < 999; k++)
    {

        /* Calculate some more intermediate variables */

        /* Determine the range of allowed values to contribute to the second output matrix. */

        /* Calculate the real and imaginary components of the second output matrix */
        /* real = cos(value), imaginary = sin(value) */
        /* This is were it crashes, unless real and imaginary are constant values (1.0) */

        /* Sum up the contributions of the extracted vector to the second output matrix */

     }
     /* Construct the Second output matrix from some intermediate variables and the real and imaginary components */

}
}

Pensé que esto podría deberse a un límite de registro, pero la calculadora de ocupación indica que este no es el caso, estoy usando menos de los 32,768 registros con 512 subprocesos. ¿Alguien puede dar alguna sugerencia sobre cuál podría ser la causa de esto?

Aquí está la información ptasx:

ptxas info    : Compiling entry function '_Z40KerneliidddddPKdS0_S0_S0_iiiiiiiiiPdS1_S1_S1_S1_S1_S1_S1_S1_S1_' for 'sm_20' 

ptxas info    : Function properties for _Z40KerneliidddddPKdS0_S0_S0_iiiiiiiiiPdS1_S1_S1_S1_S1_S1_S1_S1_S1_ 

8056 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads 

ptxas info    : Function properties for __internal_trig_reduction_slowpathd 

40 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads 

ptxas info    : Used 53 registers, 232 bytes cmem[0], 144 bytes cmem[2], 28 bytes cmem[16]

tmpxft_00001d70_00000000-3_MexFunciton.cudafe1.cpp 

Respuestas a la pregunta(1)

Su respuesta a la pregunta