Есть ли лучший / более чистый / элегантный способ malloc и free в 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;
};
Это сокращенная версия, но вы можете видеть, как она продолжает расти. На самом деле я пытаюсь выделить около 15 массивов. Становится некрасиво - но работает правильно.
Мысли?
3 ответа
Некоторые возможности:
{бесплатно для всех устройств без необходимости просматривать список указателей.
если вы намереваетесь выйти (приложение), все распределения устройств автоматически освобождаются после завершения работы приложения. Среда выполнения cuda обнаруживает завершение процесса, связанного с контекстом устройства приложения, и стирает этот контекст в этот момент. Так что, если вы просто собираетесь выйти, можно безопасно не выполнять никаких операций
cudaFree()
.
Я бы также отговорил вас от написания собственных классов, владеющих ресурсами, и посоветовал бы использовать библиотеку. nullptr
, вероятно, является наиболее широко используемым контейнером памяти устройства. Библиотека Thrust является частью набора инструментов CUDA.…
int* p1 = nullptr;
int* p2 = nullptr;
int* p3 = nullptr;
if (!(p1 = allocate()))
goto EXIT_BLOCK;
if (!(p2 = allocate()))
goto EXIT_BLOCK;
if (!(p3 = allocate()))
goto EXIT_BLOCK;
EXIT_BLOCK:
free(p3); free(p2); free(p1);
Вопрос помечен C ++, поэтому вот решение C ++
Общая практика состоит в том, чтобы получить ресурсы в конструкторе и освободить их в деструкторе. Идея состоит в том, что при любых обстоятельствах ресурс гарантированно будет освобожден вызовом деструктора. Приятным побочным эффектом является то, что деструктор вызывается автоматически в конце области видимости, поэтому вам вообще не нужно ничего делать для освобождения ресурса, когда он больше не используется. См. RAII.
Общая практика состоит в том, чтобы получить ресурсы в конструкторе и освободить их в деструкторе. Идея состоит в том, что при любых обстоятельствах ресурс гарантированно будет освобожден вызовом деструктора. Приятным побочным эффектом является то, что деструктор вызывается автоматически в конце области видимости, поэтому вам вообще не нужно ничего делать для освобождения ресурса, когда он больше не используется. См. RAII.…
Я бы также отговорил вас от написания собственных классов, владеющих ресурсами, и посоветовал бы использовать библиотеку. thrust::device_vector
, вероятно, является наиболее широко используемым контейнером памяти устройства. Библиотека Thrust является частью набора инструментов CUDA.
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.