LINUX.ORG.RU

Повторное использование массива в глобальной памяти в CUDA

 


0

3

Добрый день! Есть проблема.

Я выделяю память под результат вычислений. err = cudaMalloc((void**)&nor.d_tdel,szTdelb);

где szTdelb: размер выделяемой памяти.

Затем последовательно выполняются 2 kernels:

d_normaAnew <« curgrsz, nor.blksz, szShMem, *stream»>(igrA, gdmnBeg, grM, grN, nor.d_tdel);

и

d_normaABnew <« nor.blks, nor.blksz, szShMem»>(nor.d_mn, M, N, nor.d_tdel);

И там и там я указываю на одно и тоже место в памяти nor.d_tdel.

Проблема: печать nor.d_tdel в конце d_normaAnew содержит правильные данные, а в начале d_normaABnew я получаю одни нули.

В чем может быть причина?


d_normaAnew <« curgrsz, nor.blksz, szShMem, *stream»>(igrA, gdmnBeg, grM, grN, nor.d_tdel);

d_normaABnew <« nor.blks, nor.blksz, szShMem»>(nor.d_mn, M, N, nor.d_tdel);

В первый вызов передаётся stream, а во второй нет, значит будет запущен в дефолтном. Я не спец по куде, но по идее они из-за этого запустятся одновременно, а не последовательно. Или запускай оба вызова в одном стриме или добавь ожидание через cudaStreamSynchronize(stream).

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

да, ты прав. у меня между вызовами сначала цикле по всем стримам cudaStreamSynchronize а потом еще cudaDeviceSynchronize.

Но спасибо за идею - сейчас проверю

ezus
() автор топика