erro de ECC incorreto cuda encontrado

Meu ambiente é

Windows 7 x64Matlab 2012a x64Cuda SDK 4.2GPU Tesla C2050

Estou tendo problemas para descobrir por que minha GPU está falhando com o "erro de ECC incorrigível encontrado". Este erro só ocorre quando eu uso 512 threads ou mais. Não posso postar o kernel, mas vou tentar descrever o que ele faz.

Em geral, o kernel usa vários parâmetros e produz 2 matrizes complexas definidas pelo tamanho do encadeamento, M e outro número, N. Portanto, as matrizes retornadas serão do tamanho MxN. Uma configuração típica é 512x512, mas cada número é independente e pode variar para cima ou para baixo. O kernel funciona quando os números são 256x256.

Cada thread (kernel) extrai um vetor de tamanho 999 de um array 2D com base no id do thread, ou seja, tamanho 999xM, depois percorre a linha (0 .. N-1) das matrizes de saída para cálculo. Um número de parâmetros intermediários são calculados, usando apenas pow, sin e cos entre os+ - * / operadores. Para calcular uma das matrizes de saída, é necessário executar um loop adicional para somar a contribuição do vetor 999 que foi extraído anteriormente. Esse loop faz alguns cálculos intermediários para determinar um intervalo de valores que permitirá a contribuição. A contribuição é então escalada por um fator determinado pelos valores cos e seno de um valor fracionário calculado. É aqui que ele cai. Se eu mantiver um valor constante ou 1.0 ou qualquer outro, o kernel executa sem problemas. no entanto, quando apenas uma das chamadas (cos ou sine) é incluída, o kernel falha.

Algum psuedocode segue:

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 */

}
}

Eu pensei que isso poderia ser devido a um limite de registro, mas a calculadora de ocupação indica que este não é o caso, estou usando menos do que os 32.768 registros com 512 threads. Alguém pode dar alguma sugestão sobre qual poderia ser a causa disso?

Aqui está a informação do 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 

questionAnswers(1)

yourAnswerToTheQuestion