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

Мое окружение

  • Windows 7 x64
  • Матлаб 2012а x64
  • Куда SDK 4.2
  • ГП Тесла C2050

Мне трудно понять, почему мой графический процессор дает сбой из-за «обнаружена неисправимая ошибка ECC». Эта ошибка возникает только тогда, когда я использую 512 потоков или более. Выложить ядро ​​не могу, но попробую описать что оно делает.

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

Каждый поток (ядро ​​)извлекает вектор размера 999 из двумерного массива на основе идентификатора потока, т. е. размера 999xM, затем циклически проходит по строке (0.. N -1 )массива выходные матрицы для расчета. Ряд промежуточных параметров вычисляется только с использованием pow, sin и cos среди операторов + - * /. Для вычисления одной из выходных матриц необходимо выполнить дополнительный цикл для суммирования вклада вектора 999, который был извлечен ранее. Этот цикл выполняет некоторые промежуточные вычисления, чтобы определить диапазон значений, которые позволят внести вклад. Затем вклад масштабируется с помощью коэффициента, определяемого значениями косинуса и синуса рассчитанного дробного значения. Вот где он терпит крах. Если я вставляю постоянное значение, или 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 
5
задан janisz 16 December 2013 в 23:17
поделиться