Когда выполняется выделение CUDA thrust device_vector? - PullRequest
0 голосов
/ 08 ноября 2019

Я использую Visual Studio 2017 и CUDA 10.2 в Windows 10. Я хотел бы знать, когда выполняется перераспределение памяти для CUDA thrust device_vector. Предположим, что есть thrust :: device_vector, и размер действительно большой, почти 100% использование графического процессора, я понимаю, что thrust :: system :: detail :: bad_alloc выброшен. Тем не менее, кажется, что bad_alloc иногда генерируется после завершения изменения размера и после выполнения некоторых следующих кодов.

Весь код слишком длинный, поэтому я прошу прощения за некоторый псевдокод, но код выглядит примерно так:

thrust::device_vector<int> dev_vec;
dev_vec.resize(big_size);

std::cout << "A" << std::endl;

Kernel_func<<<num_blocks, block_size>>>(thrust::raw_pointer_cast(dev_vec.data()));

std::cout << "B" << std::endl;

cudaGetLastError()

std::cout << "C" << std::endl;

cudaDeviceSynchronize()

std::cout << "D" << std::endl;

Ошибка возникает только тогда, когда размер device_vector близок к размеру памяти графического процессора, но в журнале иногда указывается

A
B
C
Microsoft C++ exception: thrust::system::detail::bad_alloc at memory location xxxxx

, а иногда -

A
B
C
D
Microsoft C++ exception: thrust::system::detail::bad_alloc at memory location xxxxx

Я также пытался

try {
dev_vec.resize(big_size);
}
catch (std::bad_alloc& e) {
std::cout << "Error at resize." << std::endl;
}

, но, похоже, resize () не выдает ошибку bad_alloc.

Распределение памяти происходит (ас) синхронно? Или в любом случае можно поймать bad_alloc всякий раз, когда это происходит?

...