diff --git a/hercules_rt/build.rs b/hercules_rt/build.rs index 00773d0662e8e5f4160feeab9462f597099d8439..15b9f6396d2c90eee66dfecb5a255cef2890726b 100644 --- a/hercules_rt/build.rs +++ b/hercules_rt/build.rs @@ -6,7 +6,7 @@ fn main() { if cfg!(feature = "cuda") { let out_dir = var("OUT_DIR").unwrap(); Command::new("nvcc") - .args(&["src/rtdefs.cu", "-c", "-fPIC", "-o"]) + .args(&["src/rtdefs.cu", "-c", "-o"]) .arg(&format!("{}/rtdefs.o", out_dir)) .status() .expect("PANIC: NVCC failed when building runtime. Is NVCC installed?"); @@ -17,7 +17,9 @@ fn main() { .unwrap(); println!("cargo::rustc-link-search=native={}", out_dir); + println!("cargo::rustc-link-search=native=/usr/lib/x86_64-linux-gnu/"); println!("cargo::rustc-link-lib=static=rtdefs"); + println!("cargo::rustc-link-lib=cudart"); println!("cargo::rerun-if-changed=src/rtdefs.cu"); } } diff --git a/hercules_rt/src/rtdefs.cu b/hercules_rt/src/rtdefs.cu index 890bf69849262b699d5823505270844139dfd98f..b7378d816c65666b445a989fc6b0530d821beb7b 100644 --- a/hercules_rt/src/rtdefs.cu +++ b/hercules_rt/src/rtdefs.cu @@ -1,36 +1,38 @@ -void *cuda_alloc(size_t size) { - void *ptr = NULL; - cudaError_t res = cudaMalloc(&ptr, size); - if (res != cudaSuccess) { - ptr = NULL; +extern "C" { + void *cuda_alloc(size_t size) { + void *ptr = NULL; + cudaError_t res = cudaMalloc(&ptr, size); + if (res != cudaSuccess) { + ptr = NULL; + } + return ptr; } - return ptr; -} - -void *cuda_alloc_zeroed(size_t size) { - void *ptr = cuda_alloc(size); - if (!ptr) { - return NULL; + + void *cuda_alloc_zeroed(size_t size) { + void *ptr = cuda_alloc(size); + if (!ptr) { + return NULL; + } + cudaError_t res = cudaMemset(ptr, 0, size); + if (res != cudaSuccess) { + return NULL; + } + return ptr; } - cudaError_t res = cudaMemset(ptr, 0, size); - if (res != cudaSuccess) { - return NULL; + + void cuda_dealloc(void *ptr) { + cudaFree(ptr); + } + + void copy_cpu_to_cuda(void *dst, void *src, size_t size) { + cudaMemcpy(dst, src, size, cudaMemcpyHostToDevice); + } + + void copy_cuda_to_cpu(void *dst, void *src, size_t size) { + cudaMemcpy(dst, src, size, cudaMemcpyDeviceToHost); + } + + void copy_cuda_to_cuda(void *dst, void *src, size_t size) { + cudaMemcpy(dst, src, size, cudaMemcpyDeviceToDevice); } - return ptr; -} - -void cuda_dealloc(void *ptr) { - cudaFree(ptr); -} - -void copy_cpu_to_cuda(void *dst, void *src, size_t size) { - cudaMemcpy(dst, src, size, cudaMemcpyHostToDevice); -} - -void copy_cuda_to_cpu(void *dst, void *src, size_t size) { - cudaMemcpy(dst, src, size, cudaMemcpyDeviceToHost); -} - -void copy_cuda_to_cuda(void *dst, void *src, size_t size) { - cudaMemcpy(dst, src, size, cudaMemcpyDeviceToDevice); }