Я использую 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 всякий раз, когда это происходит?