Skip to content

Commit 2ca04c8

Browse files
committed
Remove rust bindings for pinned memory
1 parent 1cb6e44 commit 2ca04c8

File tree

4 files changed

+6
-231
lines changed

4 files changed

+6
-231
lines changed

wrappers/rust/icicle-core/src/msm/mod.rs

-5
Original file line numberDiff line numberDiff line change
@@ -388,11 +388,6 @@ macro_rules! impl_msm_tests {
388388
check_msm::<$curve>()
389389
}
390390

391-
#[test]
392-
fn test_msm_pinned() {
393-
check_msm_pinned_memory::<$curve>()
394-
}
395-
396391
#[test]
397392
fn test_msm_batch() {
398393
check_msm_batch::<$curve>()

wrappers/rust/icicle-core/src/msm/tests.rs

+1-83
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::curve::{Affine, Curve, Projective};
22
use crate::msm::{msm, precompute_points, MSMConfig, MSM};
33
use crate::traits::{FieldImpl, GenerateRandom};
44
use icicle_cuda_runtime::device::{get_device_count, set_device, warmup};
5-
use icicle_cuda_runtime::memory::{CudaHostAllocFlags, CudaHostRegisterFlags, DeviceVec, HostOrDeviceSlice, HostSlice};
5+
use icicle_cuda_runtime::memory::{DeviceVec, HostSlice};
66
use icicle_cuda_runtime::stream::CudaStream;
77
use rayon::iter::{IntoParallelIterator, ParallelIterator};
88

@@ -105,88 +105,6 @@ where
105105
});
106106
}
107107

108-
pub fn check_msm_pinned_memory<C: Curve + MSM<C> + 'static>()
109-
where
110-
<C::ScalarField as FieldImpl>::Config: GenerateRandom<C::ScalarField>,
111-
C::ScalarField: ArkConvertible<ArkEquivalent = <C::ArkSWConfig as ArkCurveConfig>::ScalarField>,
112-
C::BaseField: ArkConvertible<ArkEquivalent = <C::ArkSWConfig as ArkCurveConfig>::BaseField>,
113-
{
114-
let largest_size = 1 << 16;
115-
// let test_sizes = [1 << 10, largest_size];
116-
let test_size = largest_size;
117-
let mut msm_results = DeviceVec::<Projective<C>>::cuda_malloc(1).unwrap();
118-
let random_points = generate_random_affine_points_with_zeroes(largest_size, 2);
119-
let points: &HostSlice<Affine<C>> = HostSlice::from_slice(&random_points);
120-
121-
// TODO: implement cudaHostRegister via HostSlice.pin
122-
// let pin = points.is_pinnable();
123-
// if pin {
124-
// points.pin(CudaHostRegisterFlags::DEFAULT).unwrap();
125-
// let flags = points.get_memory_flags().unwrap();
126-
// println!("Flags of registered pin: {:?}", flags);
127-
// unsafe {
128-
// println!("points address Rust after pin: {:?}", points.as_ptr());
129-
// }
130-
// points.unpin();
131-
// unsafe {
132-
// println!("points address Rust after unpin: {:?}", points.as_ptr());
133-
// }
134-
// }
135-
136-
let scalars = <<C as Curve>::ScalarField as FieldImpl>::Config::generate_random(largest_size);
137-
138-
let mut scalars_d = DeviceVec::<<C as Curve>::ScalarField>::cuda_malloc(test_size).unwrap();
139-
let stream = CudaStream::create().unwrap();
140-
scalars_d
141-
.copy_from_host_async(HostSlice::from_slice(&scalars[..test_size]), &stream)
142-
.unwrap();
143-
144-
let mut cfg = MSMConfig::default();
145-
cfg.ctx
146-
.stream = &stream;
147-
cfg.is_async = true;
148-
msm(&scalars_d[..], points, &cfg, &mut msm_results[..]).unwrap();
149-
150-
let mut msm_host_result = vec![Projective::<C>::zero(); 1];
151-
msm_results
152-
.copy_to_host(HostSlice::from_mut_slice(&mut msm_host_result[..]))
153-
.unwrap();
154-
stream
155-
.synchronize()
156-
.unwrap();
157-
158-
let msm_res_affine: ark_ec::short_weierstrass::Affine<<C as Curve>::ArkSWConfig> = msm_host_result[0]
159-
.to_ark()
160-
.into();
161-
assert!(msm_res_affine.is_on_curve());
162-
163-
points.allocate_pinned(points.len(), CudaHostAllocFlags::DEFAULT).unwrap();
164-
// let allocated_pinned_points = HostSlice::allocate_pinned(points.len(), CudaHostAllocFlags::DEFAULT).unwrap();
165-
// allocated_pinned_points
166-
// .as_mut_slice()
167-
// .clone_from_slice(points.as_slice());
168-
169-
msm(&scalars_d[..], points, &cfg, &mut msm_results[..]).unwrap();
170-
171-
let mut msm_host_result = vec![Projective::<C>::zero(); 1];
172-
msm_results
173-
.copy_to_host(HostSlice::from_mut_slice(&mut msm_host_result[..]))
174-
.unwrap();
175-
stream
176-
.synchronize()
177-
.unwrap();
178-
179-
let msm_res_affine: ark_ec::short_weierstrass::Affine<<C as Curve>::ArkSWConfig> = msm_host_result[0]
180-
.to_ark()
181-
.into();
182-
assert!(msm_res_affine.is_on_curve());
183-
points.free_pinned();
184-
185-
stream
186-
.destroy()
187-
.unwrap();
188-
}
189-
190108
pub fn check_msm_batch<C: Curve + MSM<C>>()
191109
where
192110
<C::ScalarField as FieldImpl>::Config: GenerateRandom<C::ScalarField>,

wrappers/rust/icicle-cuda-runtime/src/device.rs

+2-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::{
22
bindings::{
3-
cudaDeviceAttr, cudaDeviceGetAttribute, cudaFreeAsync, cudaGetDevice, cudaGetDeviceCount, cudaMallocAsync,
4-
cudaMemGetInfo, cudaPointerAttributes, cudaPointerGetAttributes, cudaSetDevice,
3+
cudaFreeAsync, cudaGetDevice, cudaGetDeviceCount, cudaMallocAsync, cudaMemGetInfo, cudaPointerAttributes,
4+
cudaPointerGetAttributes, cudaSetDevice,
55
},
66
error::{CudaResult, CudaResultWrap},
77
stream::CudaStream,
@@ -32,11 +32,6 @@ pub fn get_device_from_pointer(ptr: *const ::std::os::raw::c_void) -> CudaResult
3232
}
3333
}
3434

35-
pub fn get_device_attribute(attr: cudaDeviceAttr, device: usize) -> CudaResult<usize> {
36-
let mut res: i32 = 0;
37-
unsafe { cudaDeviceGetAttribute(&mut res, attr, device as i32) }.wrap_value(res as usize)
38-
}
39-
4035
pub fn check_device(device_id: usize) {
4136
match device_id == get_device().unwrap() {
4237
true => (),

wrappers/rust/icicle-cuda-runtime/src/memory.rs

+3-136
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,17 @@
11
use crate::bindings::{
2-
cudaDeviceAttr, cudaFree, cudaFreeHost, cudaHostAlloc, cudaHostAllocDefault, cudaHostAllocPortable,
3-
cudaHostGetFlags, cudaHostRegister, cudaHostRegisterDefault, cudaHostRegisterPortable, cudaHostUnregister,
4-
cudaMalloc, cudaMallocAsync, cudaMemPool_t, cudaMemcpy, cudaMemcpyAsync, cudaMemcpyKind,
2+
cudaFree, cudaMalloc, cudaMallocAsync, cudaMemPool_t, cudaMemcpy, cudaMemcpyAsync, cudaMemcpyKind,
53
};
6-
use crate::device::{check_device, get_device_attribute, get_device_from_pointer};
4+
use crate::device::{check_device, get_device_from_pointer};
75
use crate::error::{CudaError, CudaResult, CudaResultWrap};
86
use crate::stream::CudaStream;
9-
use bitflags::bitflags;
107
use std::mem::{size_of, ManuallyDrop, MaybeUninit};
118
use std::ops::{
129
Deref, DerefMut, Index, IndexMut, Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive,
1310
};
14-
use std::os::raw::{c_uint, c_void};
11+
use std::os::raw::c_void;
1512
use std::slice::from_raw_parts_mut;
1613
use std::slice::SliceIndex;
1714

18-
bitflags! {
19-
pub struct CudaHostAllocFlags: u32 {
20-
const DEFAULT = cudaHostAllocDefault;
21-
const PORTABLE = cudaHostAllocPortable;
22-
}
23-
}
24-
25-
bitflags! {
26-
pub struct CudaHostRegisterFlags: u32 {
27-
const DEFAULT = cudaHostRegisterDefault;
28-
const PORTABLE = cudaHostRegisterPortable;
29-
}
30-
}
31-
3215
#[derive(Debug)]
3316
pub struct HostSlice<T>([T]);
3417
pub struct DeviceVec<T>(ManuallyDrop<Box<[T]>>);
@@ -134,78 +117,6 @@ impl<T> HostSlice<T> {
134117
self.0
135118
.iter_mut()
136119
}
137-
138-
// TODO: @jeremy Fix the issue where ptr pinned by cudaHostRegister cannot be used in primitives
139-
// pub fn is_pinnable(&self) -> bool {
140-
// let pinnable = get_device_attribute(cudaDeviceAttr::cudaDevAttrHostRegisterSupported, 0).unwrap();
141-
// let lockable =
142-
// get_device_attribute(cudaDeviceAttr::cudaDevAttrPageableMemoryAccessUsesHostPageTables, 0).unwrap();
143-
144-
// pinnable == 1 && lockable == 0
145-
// }
146-
147-
// pub fn pin(&self, flags: CudaHostRegisterFlags) -> CudaResult<()> {
148-
// if self.is_pinnable() {
149-
// unsafe {
150-
// let ptr = self.as_ptr() as *mut c_void;
151-
// let flags_to_set = flags.bits();
152-
// cudaHostRegister(ptr, self.len(), flags_to_set as c_uint).wrap()
153-
// }
154-
// } else {
155-
// Ok(())
156-
// }
157-
// }
158-
159-
// pub fn unpin(&self) -> CudaResult<()> {
160-
// unsafe {
161-
// let mut flags = 0;
162-
// let ptr = self.as_ptr() as *mut c_void;
163-
// cudaHostGetFlags(&mut flags, ptr).wrap()?;
164-
// cudaHostUnregister(ptr).wrap()
165-
// }
166-
// }
167-
168-
pub fn allocate_pinned(&self, count: usize, flags: CudaHostAllocFlags) -> CudaResult<()> {
169-
let size = count
170-
.checked_mul(size_of::<T>())
171-
.unwrap_or(0);
172-
if size == 0 {
173-
return Err(CudaError::cudaErrorMemoryAllocation); //TODO: only CUDA backend should return CudaError
174-
}
175-
176-
// let mut pinned_host_ptr = MaybeUninit::<*mut c_void>::uninit();
177-
178-
// unsafe {
179-
// cudaHostAlloc(pinned_host_ptr.as_mut_ptr(), size, flags.bits).wrap()?;
180-
// let pinned_host_slice = from_raw_parts_mut(pinned_host_ptr.assume_init() as *mut T, count);
181-
// Ok(Self::from_mut_slice(pinned_host_slice))
182-
// }
183-
184-
unsafe {
185-
let p_host = self.as_ptr() as *mut *mut c_void;
186-
cudaHostAlloc(p_host, size, flags.bits()).wrap()?;
187-
}
188-
189-
Ok(())
190-
}
191-
192-
pub fn free_pinned(&self) -> CudaResult<()> {
193-
unsafe {
194-
let mut flags: u32 = 0;
195-
let ptr = self.as_ptr() as *mut c_void;
196-
cudaHostGetFlags(&mut flags, ptr).wrap()?;
197-
cudaFreeHost(ptr).wrap()
198-
}
199-
}
200-
201-
pub fn get_memory_flags(&self) -> CudaResult<u32> {
202-
unsafe {
203-
let mut flags: u32 = 1234;
204-
let ptr = self.as_ptr() as *mut c_void;
205-
cudaHostGetFlags(&mut flags, ptr).wrap()?;
206-
Ok(flags)
207-
}
208-
}
209120
}
210121

211122
impl<T> DeviceSlice<T> {
@@ -513,47 +424,3 @@ impl<T> Drop for DeviceVec<T> {
513424

514425
#[allow(non_camel_case_types)]
515426
pub type CudaMemPool = cudaMemPool_t;
516-
517-
pub(crate) mod tests {
518-
use crate::error::CudaError;
519-
use crate::memory::{CudaHostAllocFlags, HostOrDeviceSlice, HostSlice};
520-
521-
// TODO: @jeremy Fix the issue where ptr pinned by cudaHostRegister cannot be used in primitives
522-
// #[test]
523-
// fn test_pin_memory() {
524-
// let data = vec![1, 2, 3, 4, 5, 7, 8, 9];
525-
// let data_host_slice = HostSlice::from_slice(&data);
526-
527-
// data_host_slice
528-
// .pin(CudaHostRegisterFlags::DEFAULT)
529-
// .expect("Registering host mem failed");
530-
// let err = data_host_slice
531-
// .pin(CudaHostRegisterFlags::DEFAULT)
532-
// .expect_err("Registering already registered memory succeeded");
533-
// assert_eq!(err, CudaError::cudaErrorHostMemoryAlreadyRegistered);
534-
535-
// data_host_slice
536-
// .unpin()
537-
// .expect("Unregistering pinned memory failed");
538-
// let err = data_host_slice
539-
// .unpin()
540-
// .expect_err("Unregistering non-registered pinned memory succeeded");
541-
// assert_eq!(err, CudaError::cudaErrorInvalidValue);
542-
// }
543-
544-
// #[test]
545-
// fn test_allocated_pinned_memory() {
546-
// let data = vec![1, 2, 3, 4, 5, 7, 8, 9];
547-
// let data_host_slice = HostSlice::from_slice(&data);
548-
// let newly_allocated_pinned_host_slice: &HostSlice<i32> =
549-
// HostSlice::allocate_pinned(data_host_slice.len(), CudaHostAllocFlags::DEFAULT)
550-
// .expect("Allocating new pinned memory failed");
551-
// newly_allocated_pinned_host_slice
552-
// .free_pinned()
553-
// .expect("Freeing pinned memory failed");
554-
// let err = newly_allocated_pinned_host_slice
555-
// .free_pinned()
556-
// .expect_err("Freeing non-pinned memory succeeded");
557-
// assert_eq!(err, CudaError::cudaErrorInvalidValue);
558-
// }
559-
}

0 commit comments

Comments
 (0)