9 #include "MemorySpace.h"
10 #include "../../FaissAssert.h"
11 #include <cuda_runtime.h>
13 namespace faiss {
namespace gpu {
16 void allocMemorySpaceV(MemorySpace space,
void** p,
size_t size) {
18 case MemorySpace::Device:
20 auto err = cudaMalloc(p, size);
23 FAISS_THROW_IF_NOT_FMT(
25 "failed to cudaMalloc %zu bytes (error %d %s)",
26 size, (
int) err, cudaGetErrorString(err));
29 case MemorySpace::Unified:
31 #ifdef FAISS_UNIFIED_MEM
32 auto err = cudaMallocManaged(p, size);
35 FAISS_THROW_IF_NOT_FMT(
37 "failed to cudaMallocManaged %zu bytes (error %d %s)",
38 size, (
int) err, cudaGetErrorString(err));
40 FAISS_THROW_MSG(
"Attempting to allocate via cudaMallocManaged "
41 "without CUDA 8+ support");
45 case MemorySpace::HostPinned:
47 auto err = cudaHostAlloc(p, size, cudaHostAllocDefault);
50 FAISS_THROW_IF_NOT_FMT(
52 "failed to cudaHostAlloc %zu bytes (error %d %s)",
53 size, (
int) err, cudaGetErrorString(err));
57 FAISS_ASSERT_FMT(
false,
"unknown MemorySpace %d", (
int) space);
64 void freeMemorySpace(MemorySpace space,
void* p) {
66 case MemorySpace::Device:
67 case MemorySpace::Unified:
69 auto err = cudaFree(p);
70 FAISS_ASSERT_FMT(err == cudaSuccess,
71 "Failed to cudaFree pointer %p (error %d %s)",
72 p, (
int) err, cudaGetErrorString(err));
75 case MemorySpace::HostPinned:
77 auto err = cudaFreeHost(p);
78 FAISS_ASSERT_FMT(err == cudaSuccess,
79 "Failed to cudaFreeHost pointer %p (error %d %s)",
80 p, (
int) err, cudaGetErrorString(err));
84 FAISS_ASSERT_FMT(
false,
"unknown MemorySpace %d", (
int) space);