cuda обнаружена неисправимая ошибка ECC

Моя среда

Windows 7 x64 Matlab 2012a x64 Cuda SDK 4.2 Tesla C2050 GPU

У меня возникли проблемы с выяснением причины сбоя моего графического процессора при "обнаруженной неисправимой ошибке ECC". Эта ошибка возникает только тогда, когда я использую 512 потоков или более. Я не могу опубликовать ядро, но постараюсь описать, что оно делает.

Как правило, ядро принимает ряд параметров и создает 2 сложные матрицы, определяемые размером потока M и другим числом N. Таким образом, возвращаемые матрицы будут иметь размер MxN. Типичная конфигурация 512x512, но каждое число является независимым и может изменяться вверх или вниз. Ядро работает, когда номера 256x256.

Каждый поток (ядро) извлекает вектор размером 999 из двумерного массива на основе идентификатора потока, то есть размером 999xM, затем циклически перебирает строку (0 .. N-1) выходных матриц для расчета. Ряд промежуточных параметров рассчитывается только с использованием pow, sin и cos среди+ - * / операторы. Чтобы вычислить одну из выходных матриц, необходимо выполнить дополнительный цикл, чтобы суммировать вклад вектора 999, который был извлечен ранее. Этот цикл выполняет некоторые промежуточные вычисления, чтобы определить диапазон значений, которые позволят внести вклад. Затем вклад масштабируется с помощью коэффициента, определяемого значениями cos и sine рассчитанного дробного значения. Вот где он падает. Если я ввожу постоянное значение или 1,0 или любое другое в этом отношении, ядро выполняется без проблем. однако, когда включен только один из вызовов (cos или sine), ядро падает.

Некоторый псевдокод следует:

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

}
}

Я думал, что это может быть связано с ограничением регистра, но калькулятор занятости показывает, что это не так, я использую менее 32 768 регистров с 512 потоками. Кто-нибудь может дать какие-либо предложения относительно того, что может быть причиной этого?

Вот информация о 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 

Ответы на вопрос(1)

Ваш ответ на вопрос