Я думаю, что вариант этого может работать для вас.
// attempt to use GPU device
if (data.device)
{
try
{
Integral::Gpu eri(S, R, Q, block.shell());
eri(basis.centers(), quartets, data.device);
data.device += size;
host_index.extend(block_index);
block_index.data.clear();
}
catch (const std::bad_alloc&)
{
// this failure was not because
// of the GPU, let it propagate
throw;
}
catch(...)
{
// handle any other exceptions by
// knowing it was the GPU and we
// can fall back onto the CPU.
}
}
// do CPU
Если вы могли бы отредактировать библиотеку GPU и дать всем исключениям GPU некоторую базу, например gpu_exception
, код станет намного проще:
// attempt to use GPU device
if (data.device)
{
try
{
Integral::Gpu eri(S, R, Q, block.shell());
eri(basis.centers(), quartets, data.device);
data.device += size;
host_index.extend(block_index);
block_index.data.clear();
}
catch (const gpu_exception&)
{
// handle GPU exceptions by
// doing nothing and falling
// back onto the CPU.
}
// all other exceptions, not being
// GPU caused, may propagate normally
}
// do CPU
Если ни одна из этих работ, я думаю, что следующая лучшая вещь - Ответ Стива .