Причина, по которой goto осуждается сегодня, заключается в том, что вместо этого у нас есть такие причудливые вещи, называемые «функциями».Оберните код графического процессора в свою собственную функцию, которая может вернуться рано, если она не удалась.
Затем вызовите это из вашей исходной функции.
Так как им, вероятно, потребуется совместно использовать несколько переменных (data
, host_index
и block_index
(похоже), поместите их в класс и сделайте из него две функции.
void RunOnGpu(){
// attempt to use GPU device
if (data.device) {
try {
Integral::Gpu eri(S, R, Q, block.shell());
eri(basis.centers(), quartets, data.device);
}
// if GPU fails, propagate to cpu
catch(std::exception) { return; }
data.device += size;
host_index.extend(block_index);
block_index.data.clear();
}
void DoStuff() {
#ifdef HAVE_GPU
RunOnGpu();
#endif
}