2016-04-04 11 views
1

Çekirdek hatası cuda-gdb kullanarak çağırmanın bir yolu var mı? Çekirdek koduna basmayı ve geçersiz dizin konumlarını, değişkenlere değişken değerlerini ayarlamayı denedim, ancak hatalı bir ayardan devam ettikten sonra bir "çekirdek yürütme başarısız" ı başlatamıyorum.Çekirdek hatası cuda-gdb üzerinden mi çağırılıyor?

Bunu cuda-gdb ile yapmanın uygun bir yolu bilen var mı? Cuda-gdb belgelerini iki kez okudum, ancak eğer mümkün olursa, bunun nasıl elde edileceğine dair bazı ipuçlarını kaçırmış olabilirim. En çok takdir edilecek herhangi bir araç/teknik bilen varsa, teşekkürler.

CentOS 7'deyim ve aygıtımın hesaplama kapasitesi 2.1'dir. Uname -a komutunun çıkışı için aşağıya bakın.

Linux john 3.10.0-327.10.1.el7.x86_64 #1 SMP Tue Feb 16 17:03:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 
+0

Bu bağlamda "çekirdek hatası" ile ne demek istiyorsunuz? Bir çekirdeğin içinde tespit edilen herhangi bir yasadışı işlem, bağlamsal yıkıma neden olur, böylece "hatalı bir ayardan devam etmek" imkansızdır. – talonmies

cevap

1

cuda-gdb kullanarak çekirdek hatası çağırmak için bir yolu var mı?

Evet, mümkün. İşte tam çalışmış örnektir: Yukarıdaki cuda-gdb çıktısında

$ cat t678.cu 
#include <stdio.h> 
__global__ void kernel(int *data){ 

    int idx = 0; // line 4 
    idx += data[0]; 
    int tval = data[idx]; 
    data[1] = tval; 
} 

int main(){ 

    int *d_data; 
    cudaMalloc(&d_data, 32*sizeof(int)); 
    cudaMemset(d_data, 0, 32*sizeof(int)); 
    kernel<<<1,1>>>(d_data); 
    cudaDeviceSynchronize(); 
    cudaError_t err = cudaGetLastError(); 
    if (err != cudaSuccess) printf("kernel fail %s\n", cudaGetErrorString(err)); 
} 
$ nvcc -g -G -o t678 t678.cu 
$ cuda-gdb ./t678 
NVIDIA (R) CUDA Debugger 
7.5 release 
Portions Copyright (C) 2007-2015 NVIDIA Corporation 
GNU gdb (GDB) 7.6.2 
Copyright (C) 2013 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-unknown-linux-gnu". 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>... 
Reading symbols from /home/user2/misc/t678...done. 
(cuda-gdb) break t678.cu:4 
Breakpoint 1 at 0x4026d5: file t678.cu, line 4. 
(cuda-gdb) run 
Starting program: /home/user2/misc/./t678 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib64/libthread_db.so.1". 
[New Thread 0x7ffff700a700 (LWP 8693)] 
[Switching focus to CUDA kernel 0, grid 2, block (0,0,0), thread (0,0,0), device 0, sm 14, warp 2, lane 0] 

Breakpoint 1, kernel<<<(1,1,1),(1,1,1)>>> (data=0x13047a0000) at t678.cu:4 
4   int idx = 0; // line 4 
(cuda-gdb) step 
5   idx += data[0]; 
(cuda-gdb) print idx 
$1 = 0 
(cuda-gdb) set idx=1000000 
(cuda-gdb) step 
6   int tval = data[idx]; 
(cuda-gdb) print idx 
$2 = 1000000 
(cuda-gdb) step 

CUDA Exception: Device Illegal Address 
The exception was triggered in device 0. 

Program received signal CUDA_EXCEPTION_10, Device Illegal Address. 
kernel<<<(1,1,1),(1,1,1)>>> (data=0x13047a0000) at t678.cu:7 
7   data[1] = tval; 
(cuda-gdb) 

, büyük bir değere idx değişkeni ayarladıktan sonra görebilirsiniz, bu (bir indeks-out-of-the sınırları yasadışı adresini sonuçları Hata ayıklayıcıda aşağıdaki satırı çalıştırırken bir hata oluştu:

int tval = data[idx]; 
+0

Bu mükemmel, teşekkürler! – John

İlgili konular