2015-04-30 2 views
1

Мой вопрос: является ли аппаратное обеспечение 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 казней.

ответ

2

Если-GDB CUDA с MemCheck включены отчетами нелегального доступом адреса как:

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 

Затем аппаратные средства сломаны.

Смежные вопросы