Я пытаюсь cudaMalloc кучу указателей устройств и изящно выходит, если какой-либо из mallocs не работает. У меня есть действующий код, но раздутый, потому что мне нужно cudaFree все, что я ранее malloc'd, если один не удается. Итак, теперь мне интересно, есть ли более сжатый способ достижения этого. Очевидно, я не могу освободить то, что не было malloc'd - это определенно вызовет проблемы.Есть ли лучший/более чистый/более элегантный способ malloc и бесплатно в cuda?
Ниже приведен фрагмент кода, который я пытаюсь сделать более элегантным.
//define device pointers
float d_norm, *d_dut, *d_stdt, *d_gamma, *d_zeta;
//allocate space on the device for the vectors and answer
if (cudaMalloc(&d_norm, sizeof(float)*vSize) != cudaSuccess) {
std::cout << "failed malloc";
return;
};
if (cudaMalloc(&d_data, sizeof(float)*vSize) != cudaSuccess) {
std::cout << "failed malloc";
cudaFree(d_norm);
return;
};
if (cudaMalloc(&d_stdt, sizeof(float)*wSize) != cudaSuccess) {
std::cout << "failed malloc";
cudaFree(d_norm);
cudaFree(d_data);
return;
};
if (cudaMalloc(&d_gamma, sizeof(float)*vSize) != cudaSuccess) {
std::cout << "failed malloc";
cudaFree(d_norm);
cudaFree(d_dut);
cudaFree(d_stdt);
return;
};
if (cudaMalloc(&d_zeta, sizeof(float)*w) != cudaSuccess) {
std::cout << "failed malloc";
cudaFree(d_norm);
cudaFree(d_dut);
cudaFree(d_stdt);
cudaFree(d_gamma);
return;
};
Это сокращенная версия, но вы можете видеть, как она только продолжает строиться. На самом деле я пытаюсь malloc около 15 массивов. Он начинает становиться уродливым - но он работает правильно.
Мысли?
Используйте 'goto', Luke. – magras
'goto' не помогает отслеживать список указателей, которые были выделены, против тех, у кого нет –
один простой способ: добавить все предметы в вектор и бесплатно в конце –