Packages
evision
0.2.16
1.0.1-rc.0
1.0.0
1.0.0-rc.0
0.2.17
0.2.17-rc2
0.2.17-rc1
0.2.16
0.2.16-pre.2
0.2.16-pre
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.2-rc2
0.2.1
0.2.0
0.1.39
0.1.38
0.1.37
0.1.36
0.1.35
0.1.34
0.1.33
0.1.32
retired
0.1.31
0.1.30
0.1.29
0.1.28
0.1.27
0.1.26
0.1.26-rc3
0.1.26-rc2
0.1.26-rc1
0.1.26-rc0
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
OpenCV-Erlang/Elixir binding.
Current section
Files
Jump to
Current section
Files
c_src/modules/evision_cuda.cc
#include "evision_cuda.h"
#ifdef CUDA_ENABLED
#include <cuda_runtime.h>
#include <cstdint>
#include <cstring>
#include <iostream>
#include <sstream>
#include <tuple>
#include <vector>
std::optional<std::pair<std::vector<unsigned char>, int>>
get_cuda_ipc_handle(std::uintptr_t ptr) {
void *device_ptr = reinterpret_cast<void *>(ptr);
cudaIpcMemHandle_t ipc_handle;
cudaError_t status = cudaIpcGetMemHandle(&ipc_handle, device_ptr);
if (status != cudaSuccess) {
return std::nullopt;
}
cudaPointerAttributes attributes{};
status = cudaPointerGetAttributes(&attributes, device_ptr);
if (status != cudaSuccess) {
return std::nullopt;
}
// Assuming sizeof(cudaIpcMemHandle_t) is constant
const size_t size = sizeof(cudaIpcMemHandle_t);
// Copy the memory handle to a byte array
std::vector<unsigned char> result(size);
memcpy(result.data(), &ipc_handle, size);
return std::make_pair(result, attributes.device);
}
std::pair<void *, std::string> get_pointer_for_ipc_handle(uint8_t *handle_bin,
size_t handle_size,
int device_id) {
std::ostringstream error_msg_stream;
if (handle_size != sizeof(cudaIpcMemHandle_t)) {
error_msg_stream << "IPC handle size does not match "
"sizeof(cudaIpcMemHandle_t), IPC handle size = "
<< handle_size << ", sizeof(cudaIpcMemHandle_t) = "
<< sizeof(cudaIpcMemHandle_t);
return std::make_pair(nullptr, error_msg_stream.str());
}
unsigned char ipc_handle_data[sizeof(cudaIpcMemHandle_t)];
for (size_t i = 0; i < sizeof(cudaIpcMemHandle_t); i++) {
ipc_handle_data[i] = handle_bin[i];
}
cudaIpcMemHandle_t ipc_handle;
memcpy(&ipc_handle, ipc_handle_data, sizeof(cudaIpcMemHandle_t));
void *ptr = nullptr;
cudaError_t cuda_status = cudaSetDevice(device_id);
if (cuda_status != cudaSuccess) {
error_msg_stream << "Error setting CUDA device: "
<< cudaGetErrorString(cuda_status);
return std::make_pair(nullptr, error_msg_stream.str());
}
cuda_status = cudaIpcOpenMemHandle((void **)&ptr, ipc_handle,
cudaIpcMemLazyEnablePeerAccess);
if (cuda_status != cudaSuccess) {
error_msg_stream << "Error opening CUDA IPC memory handle: "
<< cudaGetErrorString(cuda_status);
return std::make_pair(nullptr, error_msg_stream.str());
}
return std::make_pair(ptr, "");
}
std::optional<int64_t> get_gpumat_device_id(void * ptr) {
if (ptr == nullptr) {
return std::nullopt;
}
cudaPointerAttributes attributes{};
cudaError_t status = cudaPointerGetAttributes(&attributes, ptr);
if (status != cudaSuccess) {
return std::nullopt;
}
return attributes.device;
}
#else
std::optional<std::pair<std::vector<unsigned char>, int>>
get_cuda_ipc_handle(std::uintptr_t ptr) {
(void)ptr;
return std::nullopt;
}
std::pair<void *, std::string> get_pointer_for_ipc_handle(uint8_t *handle_bin,
size_t handle_size,
int device_id) {
(void)handle_bin;
(void)handle_size;
(void)device_id;
return std::make_pair(nullptr, "CUDA is not enabled in this build");
}
std::optional<int64_t> get_gpumat_device_id(void * ptr) {
(void)ptr;
return std::nullopt;
}
#endif