Мой вопрос: является ли аппаратное обеспечение CUDA неисправным или может быть другое объяснение? У меня есть ядро, которое использовалось около года без изменений. В последнее время я начал получать ошибки сегментации с нерегулярными интервалами, т. Е. Его можно было воспроизвести, иногда через несколько минут, иногда после нескольких часов исполнения. Это привело к минимальной версии программы, которая все еще воспроизводила segfault. Как и много обучения из postupflow posts.CUDA Незаконный доступ к адресу странности
-MemCheck CUDA, при запуске в цикле Баш повтора, в конечном итоге отчет:
========= Invalid __global__ read of size 4
========= at 0x000048f0 in SegFault.cu:157:SegFault(float*)
========= by thread (128,0,0) in block (3706,0,0)
========= Address 0x003400e8 is out of bounds
Обычно виновником плохих операции указателя был исключен. Еще одна подсказка заключалась в том, что незаконная адресация несовместима с тем, где она произошла в коде; это происходило нерегулярно для любого индекса для глобального массива по всему ядру.
На данный момент в моем вопросе наиболее вероятным объяснением является код ошибки. Что заставляет меня верить, аппаратная неисправность происходит из-CUDA GDB:
cuda-gdb ./SegFaultTest
(cuda-gdb) set cuda memcheck on
(cuda-gdb) run
Illegal access to address (@global)0x245684 detected.
Program received signal CUDA_EXCEPTION_1, Lane Illegal Address.
[Switching focus to CUDA kernel 0, grid 1, block (5537,0,0), thread (0,0,0), device 0, sm 22, warp 28, lane 0]
0x00000000004f1ff8 in kernel(float * @global)<<<(33480,1,1),(512,1,1)>>> (c=0x250000) at SegFault.cu:37
37 c[ix] += share_c[0];
(cuda-gdb) print &c[ix]
$2 = (@global float *) 0x255684
Индекс "IX" является:
int ix = blockIdx.x + blockIdx.y*gridDim.x;
И не изменяется после создания экземпляра. Действительно, 0x245684
ниже начального адреса для c=0x250000
. Тем не менее, когда я запрашиваю print &c[ix]
, он возвращает 0x255684
, что является приемлемым адресом для этого массива. Воспроизведение занимает 10-50 исполнений, прежде чем оно снова появится, , но незаконный адрес всегда один бит 0x010000
отличается от того, что print &c[ix]
возвращается. Я не могу объяснить разницу в адресе между сообщением об ошибке и печатью. В сочетании с разностью в один бит, я подозреваю, что неисправное оборудование. FWIW, 0x010000
равен максимальному размеру сетки для этого Tesla C1060.
И, наконец, я заменил карту CUDA сегодня новой моделью. Я не смог воспроизвести после 100 казней.