cuda gdb: указанное ядро ​​отсутствует в коде

Моя первоначальная проблема заключается в том, что у меня есть функции с длинным списком аргументов, которые превышают объем памяти, который разрешен для передачи в качестве аргумента ядру cuda (я не помню, сколько байтов, потому что прошло некоторое время с тех пор, как я с этим разобрались). Таким образом, способ, которым я обошел эту проблему, заключался в определении новой структуры, в которой ее члены являются указателями, указывающими на другие структуры, которые я могу разыменовать изнутри ядра.

... вот где начинается текущая проблема: в момент, когда я пытаюсь разыменовать указатели (члены структуры, которую я создал ранее) изнутри ядра, я получаю CUDA_EXCEPTION_5, Warp Out-of-range Address... из CUDA-GDB. И, кроме того, имя ядра и аргументы (которые, как сообщается, "не работают в данный момент", которые cuda-gdb выдает как сообщение с ошибкой), - это не то, что я создал в своем коде.

Теперь для более подробной информации:

Вот эти структуры:

typedef struct {

    int strx;
    int stry;
    int strz;
    float* el;

} manmat;

typedef struct {

    manmat *x;
    manmat *y;
    manmat *z;

} manmatvec;

вот как я пытаюсь сгруппировать аргументы ядра внутри основного:

int main () {

...
...

    manmat resu0;
    resu0.strx = n+2;       resu0.stry = m+2;       resu0.strz = l+2;
    if (cudaMalloc((void**)&resu0.el,sizeof(float) * (n+2)*(m+2)*(l+2)) != cudaSuccess) cout << endl << " ERROR allocating memory for manmat resu0" << endl ;
    manmat resv0;
    resv0.strx = n+2;       resv0.stry = m+2;       resv0.strz = l+2;
    if (cudaMalloc((void**)&resv0.el,sizeof(float) * (n+2)*(m+2)*(l+2)) != cudaSuccess) cout << endl << " ERROR allocating memory for manmat resv0" << endl ;
    manmat resw0;
    resw0.strx = n+2;       resw0.stry = m+2;       resw0.strz = l+2;
    if (cudaMalloc((void**)&resw0.el,sizeof(float) * (n+2)*(m+2)*(l+2)) != cudaSuccess) cout << endl << " ERROR allocating memory for manmat resw0" << endl ;
    manmatvec residues0 ;

    residues0.x = &resu0;
    residues0.y = &resv0;
    residues0.z = &resw0;

    exec_res_std_2d <<<numBlocks2D, threadsPerBlock2D>>> (residues0, ......) ;

 .....
}

... и вот что происходит в ядре:

__global__ void exec_res_std_2d (manmatvec residues, ......) {

    int i = blockIdx.x * blockDim.x + threadIdx.x;
    int k = blockIdx.y * blockDim.y + threadIdx.y;

    manmat *resup;
    manmat *resvp;
    manmat *reswp;

    resup = residues.x;
    resvp = residues.y;
    reswp = residues.z;

    manmat resu, resv, resw ;

    resu.strx = (*resup).strx;     //LINE 1626
    resu.stry = (*resup).stry;
    resu.strz = (*resup).strz;
    resu.el = (*resup).el;

    resv = *resvp;
    resw = *reswp;

    .....
}

и, наконец, это то, что CUDA-GDB дает в качестве вывода:

..................
[Launch of CUDA Kernel 1065 (exec_res_std_2d<<<(1,2,1),(32,16,1)>>>) on Device 0]
[Launch of CUDA Kernel 1066 (exec_res_bot_2d<<<(1,2,1),(32,16,1)>>>) on Device 0]

Program received signal CUDA_EXCEPTION_5, Warp Out-of-range Address.
[Switching focus to CUDA kernel 1065, grid 1066, block (0,0,0), thread (0,2,0), device 0, sm 0, warp 2, lane 0]
0x0000000003179020 in fdivide<<<(1,2,1),(32,16,1)>>> (a=warning: Variable is not live at this point. Value is undetermined.
..., pt=warning: Variable is not live at this point. Value is undetermined.
..., cells=warning: Variable is not live at this point. Value is undetermined.
...) at ola.cu:1626
1626    ola.cu: No such file or directory.
    in ola.cu

Я должен отметить, что я не определил ЛЮБУЮ функцию, __device__ или же __global__ в моем коде называется fdivide.....

Кроме того, может быть важно сказать, что в начале запуска программы внутри отладчика, несмотря на то, что я компилирую свои файлы cuda c с помощью -arch=sm_20 -g -G -gencode arch=compute_20,code=sm_20, Я получил,

[New Thread 0x7ffff3b69700 (LWP 12465)]
[Context Create of context 0x1292340 on Device 0]
warning: no loadable sections found in added symbol-file /tmp/cuda-dbg/12456/session1/elf.1292340.1619c10.o.LkkWns
warning: no loadable sections found in added symbol-file /tmp/cuda-dbg/12456/session1/elf.1292340.1940ad0.o.aHtC7W
warning: no loadable sections found in added symbol-file /tmp/cuda-dbg/12456/session1/elf.1292340.2745680.o.bVXEWl
warning: no loadable sections found in added symbol-file /tmp/cuda-dbg/12456/session1/elf.1292340.2c438b0.o.cgUqiP
warning: no loadable sections found in added symbol-file /tmp/cuda-dbg/12456/session1/elf.1292340.2c43980.o.4diaQ4
warning: no loadable sections found in added symbol-file /tmp/cuda-dbg/12456/session1/elf.1292340.2dc9380.o.YYJAr5

Любые ответы или советы, или предложения, которые могут помочь мне с этим вопросом, приветствуются! пожалуйста, обратите внимание, что я только недавно начал программировать на cuda-c, и я не очень опытен в cuda-gdb. Большую часть отладки, которую я делал в C-коде, я делал "вручную", проверяя вывод в различных точках кода....

Кроме того, этот код работает на Tesla M2090, а также скомпилирован для работы на архитектуре 2.0.

1 ответ

Решение

Это будет проблемой:

manmatvec residues0 ;

    residues0.x = &resu0;
    residues0.y = &resv0;
    residues0.z = &resw0;

resu0, resv0, а также resw0 переменные размещаются в памяти хоста - в стеке хоста. Вы помещаете адреса узлов в структуру manmatvec, а затем передаете manmatvec в ядро. На принимающей стороне код CUDA не может получить доступ к адресам памяти хоста, предоставленным в структуре.

Если вы собираетесь передать адреса resu0, resv0, resw0 переменные, вам нужно выделить их из памяти устройства.

Я не знаю, является ли это всей проблемой, но я уверен, что это главный вкладчик.

Другие вопросы по тегам