@@ -217,9 +217,9 @@ FINE_NIF(mlir_compile, ERL_NIF_DIRTY_JOB_CPU_BOUND);
217
217
218
218
// ExlaBuffer Functions
219
219
220
- std::variant<fine::Ok< uint64_t , uint64_t >,
221
- fine::Ok< std::string, uint64_t , uint64_t >,
222
- fine::Ok<std::string, uint64_t >, fine::Error< std::string>>
220
+ std::variant<std::tuple<fine::Atom, uint64_t , uint64_t >,
221
+ std::tuple<fine::Atom, std::string, uint64_t , uint64_t >,
222
+ std::tuple<fine::Atom, std::string, uint64_t >>
223
223
get_buffer_device_pointer (ErlNifEnv *env, fine::ResourcePtr<ExlaClient> client,
224
224
fine::Term buffer_term, fine::Atom pointer_kind) {
225
225
auto buffer = decode_exla_buffer (env, buffer_term);
@@ -228,7 +228,7 @@ get_buffer_device_pointer(ErlNifEnv *env, fine::ResourcePtr<ExlaClient> client,
228
228
uint64_t ptr = unwrap (buffer->GetDevicePointer (client->client ()));
229
229
230
230
if (pointer_kind == " local" ) {
231
- return fine::Ok ( ptr, device_size);
231
+ return std::make_tuple (pointer_kind, ptr, device_size);
232
232
}
233
233
234
234
if (pointer_kind == " host_ipc" ) {
@@ -237,39 +237,38 @@ get_buffer_device_pointer(ErlNifEnv *env, fine::ResourcePtr<ExlaClient> client,
237
237
auto fd = get_ipc_handle (handle_name.c_str (), device_size);
238
238
239
239
if (fd == -1 ) {
240
- return fine::Error ( std::string (" unable to get IPC handle" ) );
240
+ throw std::runtime_error (" unable to get IPC handle" );
241
241
}
242
242
243
243
auto ipc_ptr = open_ipc_handle (fd, device_size);
244
244
if (ipc_ptr == nullptr ) {
245
- return fine::Error ( std::string (" unable to open IPC handle" ) );
245
+ throw std::runtime_error (" unable to open IPC handle" );
246
246
}
247
247
248
248
memcpy (ipc_ptr, reinterpret_cast <void *>(ptr), device_size);
249
249
250
- return fine::Ok (handle_name, static_cast <uint64_t >(fd), device_size);
250
+ return std::make_tuple (pointer_kind, handle_name, static_cast <uint64_t >(fd),
251
+ device_size);
251
252
}
252
253
253
254
if (pointer_kind == " cuda_ipc" ) {
254
255
auto maybe_handle = get_cuda_ipc_handle (ptr);
255
256
if (!maybe_handle) {
256
- return fine::Error ( std::string (" unable to get cuda IPC handle" ) );
257
+ throw std::runtime_error (" unable to get cuda IPC handle" );
257
258
}
258
259
259
- return fine::Ok ( maybe_handle.value (), device_size);
260
+ return std::make_tuple (pointer_kind, maybe_handle.value (), device_size);
260
261
}
261
262
262
263
throw std::invalid_argument (" unexpected pointer type" );
263
264
}
264
265
265
266
FINE_NIF (get_buffer_device_pointer, 0 );
266
267
267
- std::variant<fine::Ok<fine::ResourcePtr<ExlaBuffer>>, fine::Error<std::string>>
268
- create_buffer_from_device_pointer (ErlNifEnv *env,
269
- fine::ResourcePtr<ExlaClient> client,
270
- fine::Atom pointer_kind,
271
- fine::Term pointer_data, xla::Shape shape,
272
- int64_t device_id) {
268
+ fine::ResourcePtr<ExlaBuffer> create_buffer_from_device_pointer (
269
+ ErlNifEnv *env, fine::ResourcePtr<ExlaClient> client,
270
+ fine::Atom pointer_kind, fine::Term pointer_data, xla::Shape shape,
271
+ int64_t device_id) {
273
272
void *ptr = nullptr ;
274
273
std::function<void ()> on_delete_callback = []() {};
275
274
@@ -278,7 +277,7 @@ create_buffer_from_device_pointer(ErlNifEnv *env,
278
277
auto maybe_pointer = get_pointer_for_ipc_handle (
279
278
cuda_ipc_handle_bin.data , cuda_ipc_handle_bin.size , device_id);
280
279
if (!maybe_pointer) {
281
- return fine::Error< std::string> (" unable to get pointer for IPC handle" );
280
+ throw std::runtime_error (" unable to get pointer for IPC handle" );
282
281
}
283
282
ptr = maybe_pointer.value ();
284
283
} else if (pointer_kind == " host_ipc" ) {
@@ -289,7 +288,7 @@ create_buffer_from_device_pointer(ErlNifEnv *env,
289
288
auto device_size = xla::ShapeUtil::ByteSizeOf (shape);
290
289
ptr = open_ipc_handle (fd, device_size);
291
290
if (ptr == nullptr ) {
292
- return fine::Error< std::string> (" unable to get pointer for IPC handle" );
291
+ throw std::runtime_error (" unable to get pointer for IPC handle" );
293
292
}
294
293
on_delete_callback = [fd, memname, ptr, device_size]() {
295
294
close_ipc_handle (fd, ptr, memname.c_str (), device_size);
@@ -305,7 +304,7 @@ create_buffer_from_device_pointer(ErlNifEnv *env,
305
304
client->client ()->LookupDevice (xla::PjRtGlobalDeviceId (device_id)));
306
305
auto buffer = unwrap (client->client ()->CreateViewOfDeviceBuffer (
307
306
ptr, shape, device, on_delete_callback));
308
- return fine::Ok (fine:: make_resource<ExlaBuffer>(std::move (buffer) ));
307
+ return fine::make_resource<ExlaBuffer>(std::move (buffer));
309
308
}
310
309
311
310
FINE_NIF (create_buffer_from_device_pointer, 0 );
0 commit comments