rtx-cfd legacy GPU modules: cudarc 0.18 API — unsafe launches, the stream accessor, memcpy_htod argument order; the renamed k-ε constants and ::standard(); get_module clones; CfdConfig test literals take ..Default
CI / Build (macos-latest) (push) Waiting to run
CI / Test (macos-latest) (push) Blocked by required conditions
CI / Test (ubuntu-latest) (push) Blocked by required conditions
CI / Python Bindings (maturin) (macos-latest) (push) Blocked by required conditions
CI / Python Bindings (maturin) (ubuntu-latest) (push) Blocked by required conditions
CI / WASM Build + Size Check (push) Blocked by required conditions
CI / Distributed Training Tests (push) Blocked by required conditions
CI / CI Success (push) Blocked by required conditions
CI / Build (ubuntu-latest) (push) Failing after 5s
CI / Clippy Check (push) Failing after 5s
Documentation / Build User Guide (push) Successful in 6s
Documentation / Build API Documentation (push) Failing after 17s
CI / Build CPU-Only (Explicit) (push) Failing after 32s
CI / Format Check (push) Failing after 42s
Performance Benchmarks / Run Benchmarks (push) Successful in 1m59s

This commit is contained in:
Omar Sobh
2026-09-16 07:16:39 -05:00
parent de435eb91c
commit 5e402918bb
6 changed files with 432 additions and 378 deletions
@@ -377,21 +377,23 @@ impl PisoGpuSolver {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.mass_source)
.arg(u)
.arg(v)
.arg(&(density / dt))
.arg(&dx)
.arg(&dy)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Divergence kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.mass_source)
.arg(u)
.arg(v)
.arg(&(density / dt))
.arg(&dx)
.arg(&dy)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Divergence kernel launch failed: {}", e))
})?;
}
}
self.kernel_manager.synchronize()?;
@@ -460,21 +462,23 @@ impl PisoGpuSolver {
let correction_factor = -dt / density;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&buffers.pressure_correction)
.arg(&mut buffers.u_correction.clone())
.arg(&mut buffers.v_correction.clone())
.arg(&correction_factor)
.arg(&dx)
.arg(&dy)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Gradient kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&buffers.pressure_correction)
.arg(&mut buffers.u_correction.clone())
.arg(&mut buffers.v_correction.clone())
.arg(&correction_factor)
.arg(&dx)
.arg(&dy)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Gradient kernel launch failed: {}", e))
})?;
}
}
self.kernel_manager.synchronize()?;
@@ -644,6 +648,7 @@ mod tests {
viscosity: 0.01,
density: 1.0,
device_id: 0,
..CfdConfig::default()
};
let params = PisoParameters::default();
@@ -702,6 +707,7 @@ mod tests {
viscosity: 0.01,
density: 1.0,
device_id: 0,
..CfdConfig::default()
};
let params = PisoParameters::default();
@@ -499,6 +499,7 @@ mod tests {
viscosity: 0.01,
density: 1.0,
device_id: 0,
..CfdConfig::default()
};
let params = SimpleParameters::new();
@@ -215,20 +215,22 @@ impl D2Q9GpuSolver {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut f.clone())
.arg(density)
.arg(velocity_x)
.arg(velocity_y)
.arg(&(self.cs2 as f32))
.arg(&(nx as i32))
.arg(&(ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Equilibrium init kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut f.clone())
.arg(density)
.arg(velocity_x)
.arg(velocity_y)
.arg(&(self.cs2 as f32))
.arg(&(nx as i32))
.arg(&(ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Equilibrium init kernel launch failed: {}", e))
})?;
}
}
self.kernel_manager.synchronize()?;
@@ -281,18 +283,20 @@ impl D2Q9GpuSolver {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f.clone())
.arg(&buffers.f_eq)
.arg(&(self.omega as f32))
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Collision kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f.clone())
.arg(&buffers.f_eq)
.arg(&(self.omega as f32))
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Collision kernel launch failed: {}", e))
})?;
}
}
self.kernel_manager.synchronize()?;
@@ -324,17 +328,19 @@ impl D2Q9GpuSolver {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f_temp.clone())
.arg(&buffers.f)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Streaming kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f_temp.clone())
.arg(&buffers.f)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Streaming kernel launch failed: {}", e))
})?;
}
}
// Swap buffers: f = f_temp
@@ -368,22 +374,24 @@ impl D2Q9GpuSolver {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.density.clone())
.arg(&mut buffers.velocity_x.clone())
.arg(&mut buffers.velocity_y.clone())
.arg(&buffers.f)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!(
"Macroscopic variables kernel launch failed: {}",
e
))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.density.clone())
.arg(&mut buffers.velocity_x.clone())
.arg(&mut buffers.velocity_y.clone())
.arg(&buffers.f)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!(
"Macroscopic variables kernel launch failed: {}",
e
))
})?;
}
}
self.kernel_manager.synchronize()?;
@@ -415,19 +423,21 @@ impl D2Q9GpuSolver {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f_eq.clone())
.arg(&buffers.density)
.arg(&buffers.velocity_x)
.arg(&buffers.velocity_y)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Equilibrium kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f_eq.clone())
.arg(&buffers.density)
.arg(&buffers.velocity_x)
.arg(&buffers.velocity_y)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Equilibrium kernel launch failed: {}", e))
})?;
}
}
self.kernel_manager.synchronize()?;
@@ -459,16 +469,18 @@ impl D2Q9GpuSolver {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f.clone())
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Boundary kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f.clone())
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Boundary kernel launch failed: {}", e))
})?;
}
}
self.kernel_manager.synchronize()?;
@@ -513,22 +525,24 @@ impl D2Q9GpuSolver {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f.clone())
.arg(&mut buffers.density.clone())
.arg(&mut buffers.velocity_x.clone())
.arg(&mut buffers.velocity_y.clone())
.arg(&(density as f32))
.arg(&(velocity.x as f32))
.arg(&(velocity.y as f32))
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Initialization kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f.clone())
.arg(&mut buffers.density.clone())
.arg(&mut buffers.velocity_x.clone())
.arg(&mut buffers.velocity_y.clone())
.arg(&(density as f32))
.arg(&(velocity.x as f32))
.arg(&(velocity.y as f32))
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Initialization kernel launch failed: {}", e))
})?;
}
}
self.kernel_manager.synchronize()?;
@@ -395,17 +395,19 @@ __global__ void d3q19_bounce_back_boundaries(
shared_mem_bytes: 0,
};
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f.clone())
.arg(&buffers.f_eq)
.arg(&(omega as f32))
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| CfdError::gpu_error(&format!("Collision kernel launch failed: {}", e)))?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f.clone())
.arg(&buffers.f_eq)
.arg(&(omega as f32))
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| CfdError::gpu_error(&format!("Collision kernel launch failed: {}", e)))?;
}
self.kernel_manager.synchronize()?;
Ok(())
@@ -436,16 +438,18 @@ __global__ void d3q19_bounce_back_boundaries(
shared_mem_bytes: 0,
};
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f_temp.clone())
.arg(&buffers.f)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| CfdError::gpu_error(&format!("Streaming kernel launch failed: {}", e)))?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f_temp.clone())
.arg(&buffers.f)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| CfdError::gpu_error(&format!("Streaming kernel launch failed: {}", e)))?;
}
// Swap buffers: f = f_temp
// In real implementation, would swap buffer pointers
@@ -483,24 +487,26 @@ __global__ void d3q19_bounce_back_boundaries(
shared_mem_bytes: 0,
};
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.density.clone())
.arg(&mut buffers.velocity_x.clone())
.arg(&mut buffers.velocity_y.clone())
.arg(&mut buffers.velocity_z.clone())
.arg(&buffers.f)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!(
"Macroscopic variables kernel launch failed: {}",
e
))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.density.clone())
.arg(&mut buffers.velocity_x.clone())
.arg(&mut buffers.velocity_y.clone())
.arg(&mut buffers.velocity_z.clone())
.arg(&buffers.f)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!(
"Macroscopic variables kernel launch failed: {}",
e
))
})?;
}
self.kernel_manager.synchronize()?;
Ok(())
@@ -531,21 +537,23 @@ __global__ void d3q19_bounce_back_boundaries(
shared_mem_bytes: 0,
};
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f_eq.clone())
.arg(&buffers.density)
.arg(&buffers.velocity_x)
.arg(&buffers.velocity_y)
.arg(&buffers.velocity_z)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Equilibrium kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f_eq.clone())
.arg(&buffers.density)
.arg(&buffers.velocity_x)
.arg(&buffers.velocity_y)
.arg(&buffers.velocity_z)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Equilibrium kernel launch failed: {}", e))
})?;
}
self.kernel_manager.synchronize()?;
Ok(())
@@ -575,15 +583,17 @@ __global__ void d3q19_bounce_back_boundaries(
shared_mem_bytes: 0,
};
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f.clone())
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| CfdError::gpu_error(&format!("Boundary kernel launch failed: {}", e)))?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f.clone())
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| CfdError::gpu_error(&format!("Boundary kernel launch failed: {}", e)))?;
}
self.kernel_manager.synchronize()?;
Ok(())
@@ -628,21 +638,23 @@ __global__ void d3q19_bounce_back_boundaries(
shared_mem_bytes: 0,
};
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f.clone())
.arg(&(density as f32))
.arg(&(velocity.x as f32))
.arg(&(velocity.y as f32))
.arg(&(velocity.z as f32))
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Initialization kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.f.clone())
.arg(&(density as f32))
.arg(&(velocity.x as f32))
.arg(&(velocity.y as f32))
.arg(&(velocity.z as f32))
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Initialization kernel launch failed: {}", e))
})?;
}
self.kernel_manager.synchronize()?;
Ok(())
@@ -771,6 +783,7 @@ mod tests {
viscosity: 0.01,
density: 1.0,
device_id: 0,
..CfdConfig::default()
};
let params = D3Q19Parameters::default();
@@ -799,6 +812,7 @@ mod tests {
viscosity: 0.01,
density: 1.0,
device_id: 0,
..CfdConfig::default()
};
let params = D3Q19Parameters::default();
@@ -839,6 +853,7 @@ mod tests {
viscosity: 0.01,
density: 1.0,
device_id: 0,
..CfdConfig::default()
};
let params = D3Q19Parameters::default();
@@ -68,7 +68,7 @@ impl KEpsilonGpuModel {
Ok(Self {
kernel_manager,
constants: KEpsilonConstants::default(),
constants: KEpsilonConstants::standard(),
k_epsilon_module: None,
gpu_buffers: None,
})
@@ -89,7 +89,7 @@ impl KEpsilonGpuModel {
fn load_k_epsilon_kernels(&mut self) -> CfdResult<()> {
// In real implementation, would compile or load PTX for k-epsilon kernels
// For now, load from kernel manager
self.k_epsilon_module = Some(self.kernel_manager.get_module("k_epsilon_kernels")?);
self.k_epsilon_module = Some(self.kernel_manager.get_module("k_epsilon_kernels")?.clone());
Ok(())
}
@@ -140,12 +140,12 @@ impl KEpsilonGpuModel {
let epsilon_host = vec![epsilon_init; n];
self.kernel_manager
.stream
.memcpy_htod(&mut buffers.k, &k_host)
.stream()
.memcpy_htod(&k_host, &mut buffers.k)
.map_err(|e| CfdError::gpu_error(&format!("Failed to copy k to GPU: {}", e)))?;
self.kernel_manager
.stream
.memcpy_htod(&mut buffers.epsilon, &epsilon_host)
.stream()
.memcpy_htod(&epsilon_host, &mut buffers.epsilon)
.map_err(|e| CfdError::gpu_error(&format!("Failed to copy epsilon to GPU: {}", e)))?;
self.kernel_manager.synchronize()?;
@@ -188,31 +188,33 @@ impl KEpsilonGpuModel {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(u)
.arg(v)
.arg(w)
.arg(&mut buffers.dudx)
.arg(&mut buffers.dudy)
.arg(&mut buffers.dudz)
.arg(&mut buffers.dvdx)
.arg(&mut buffers.dvdy)
.arg(&mut buffers.dvdz)
.arg(&mut buffers.dwdx)
.arg(&mut buffers.dwdy)
.arg(&mut buffers.dwdz)
.arg(&dx)
.arg(&dy)
.arg(&dz)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Velocity gradients kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(u)
.arg(v)
.arg(w)
.arg(&mut buffers.dudx)
.arg(&mut buffers.dudy)
.arg(&mut buffers.dudz)
.arg(&mut buffers.dvdx)
.arg(&mut buffers.dvdy)
.arg(&mut buffers.dvdz)
.arg(&mut buffers.dwdx)
.arg(&mut buffers.dwdy)
.arg(&mut buffers.dwdz)
.arg(&dx)
.arg(&dy)
.arg(&dz)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Velocity gradients kernel launch failed: {}", e))
})?;
}
}
self.kernel_manager.synchronize()?;
@@ -247,20 +249,22 @@ impl KEpsilonGpuModel {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&buffers.k)
.arg(&buffers.epsilon)
.arg(&mut buffers.eddy_viscosity)
.arg(&self.constants.c_mu)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Eddy viscosity kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&buffers.k)
.arg(&buffers.epsilon)
.arg(&mut buffers.eddy_viscosity)
.arg(&self.constants.c_mu)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Eddy viscosity kernel launch failed: {}", e))
})?;
}
}
self.kernel_manager.synchronize()?;
@@ -293,27 +297,29 @@ impl KEpsilonGpuModel {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&buffers.eddy_viscosity)
.arg(&buffers.dudx)
.arg(&buffers.dudy)
.arg(&buffers.dudz)
.arg(&buffers.dvdx)
.arg(&buffers.dvdy)
.arg(&buffers.dvdz)
.arg(&buffers.dwdx)
.arg(&buffers.dwdy)
.arg(&buffers.dwdz)
.arg(&mut buffers.production)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Production kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&buffers.eddy_viscosity)
.arg(&buffers.dudx)
.arg(&buffers.dudy)
.arg(&buffers.dudz)
.arg(&buffers.dvdx)
.arg(&buffers.dvdy)
.arg(&buffers.dvdz)
.arg(&buffers.dwdx)
.arg(&buffers.dwdy)
.arg(&buffers.dwdz)
.arg(&mut buffers.production)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Production kernel launch failed: {}", e))
})?;
}
}
self.kernel_manager.synchronize()?;
@@ -348,22 +354,24 @@ impl KEpsilonGpuModel {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&buffers.k)
.arg(&buffers.epsilon)
.arg(&buffers.production)
.arg(&mut buffers.source_epsilon)
.arg(&self.constants.c_e1)
.arg(&self.constants.c_e2)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Epsilon source kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&buffers.k)
.arg(&buffers.epsilon)
.arg(&buffers.production)
.arg(&mut buffers.source_epsilon)
.arg(&self.constants.c1_epsilon)
.arg(&self.constants.c2_epsilon)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Epsilon source kernel launch failed: {}", e))
})?;
}
}
self.kernel_manager.synchronize()?;
@@ -400,25 +408,27 @@ impl KEpsilonGpuModel {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.k)
.arg(&mut buffers.epsilon)
.arg(&buffers.k_old)
.arg(&buffers.epsilon_old)
.arg(&buffers.production)
.arg(&buffers.source_epsilon)
.arg(&buffers.eddy_viscosity)
.arg(&dt)
.arg(&nu)
.arg(&self.constants.sigma_k)
.arg(&self.constants.sigma_e)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| CfdError::gpu_error(&format!("Update kernel launch failed: {}", e)))?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.k)
.arg(&mut buffers.epsilon)
.arg(&buffers.k_old)
.arg(&buffers.epsilon_old)
.arg(&buffers.production)
.arg(&buffers.source_epsilon)
.arg(&buffers.eddy_viscosity)
.arg(&dt)
.arg(&nu)
.arg(&self.constants.sigma_k)
.arg(&self.constants.sigma_epsilon)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| CfdError::gpu_error(&format!("Update kernel launch failed: {}", e)))?;
}
}
self.kernel_manager.synchronize()?;
@@ -436,7 +446,7 @@ impl KEpsilonGpuModel {
let mut eddy_viscosity_host = vec![0.0f32; n];
self.kernel_manager
.stream
.stream()
.memcpy_dtoh(&mut eddy_viscosity_host, &buffers.eddy_viscosity)
.map_err(|e| {
CfdError::gpu_error(&format!("Failed to copy eddy viscosity from GPU: {}", e))
@@ -60,7 +60,7 @@ impl SmagorinskyGpuModel {
Ok(Self {
kernel_manager,
constants: SmagorinskyConstants::default(),
constants: SmagorinskyConstants::standard(),
smagorinsky_module: None,
gpu_buffers: None,
})
@@ -80,7 +80,7 @@ impl SmagorinskyGpuModel {
/// Load and compile Smagorinsky CUDA kernels
fn load_smagorinsky_kernels(&mut self) -> CfdResult<()> {
// In real implementation, would compile or load PTX for Smagorinsky kernels
self.smagorinsky_module = Some(self.kernel_manager.get_module("smagorinsky_kernels")?);
self.smagorinsky_module = Some(self.kernel_manager.get_module("smagorinsky_kernels")?.clone());
Ok(())
}
@@ -138,20 +138,22 @@ impl SmagorinskyGpuModel {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.delta)
.arg(&dx)
.arg(&dy)
.arg(&dz)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Filter width kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&mut buffers.delta)
.arg(&dx)
.arg(&dy)
.arg(&dz)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Filter width kernel launch failed: {}", e))
})?;
}
}
self.kernel_manager.synchronize()?;
@@ -216,31 +218,33 @@ impl SmagorinskyGpuModel {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(u)
.arg(v)
.arg(w)
.arg(&mut buffers.dudx)
.arg(&mut buffers.dudy)
.arg(&mut buffers.dudz)
.arg(&mut buffers.dvdx)
.arg(&mut buffers.dvdy)
.arg(&mut buffers.dvdz)
.arg(&mut buffers.dwdx)
.arg(&mut buffers.dwdy)
.arg(&mut buffers.dwdz)
.arg(&dx)
.arg(&dy)
.arg(&dz)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Velocity gradients kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(u)
.arg(v)
.arg(w)
.arg(&mut buffers.dudx)
.arg(&mut buffers.dudy)
.arg(&mut buffers.dudz)
.arg(&mut buffers.dvdx)
.arg(&mut buffers.dvdy)
.arg(&mut buffers.dvdz)
.arg(&mut buffers.dwdx)
.arg(&mut buffers.dwdy)
.arg(&mut buffers.dwdz)
.arg(&dx)
.arg(&dy)
.arg(&dz)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Velocity gradients kernel launch failed: {}", e))
})?;
}
}
Ok(())
@@ -274,26 +278,28 @@ impl SmagorinskyGpuModel {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&buffers.dudx)
.arg(&buffers.dudy)
.arg(&buffers.dudz)
.arg(&buffers.dvdx)
.arg(&buffers.dvdy)
.arg(&buffers.dvdz)
.arg(&buffers.dwdx)
.arg(&buffers.dwdy)
.arg(&buffers.dwdz)
.arg(&mut buffers.strain_rate)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Strain rate kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&buffers.dudx)
.arg(&buffers.dudy)
.arg(&buffers.dudz)
.arg(&buffers.dvdx)
.arg(&buffers.dvdy)
.arg(&buffers.dvdz)
.arg(&buffers.dwdx)
.arg(&buffers.dwdy)
.arg(&buffers.dwdz)
.arg(&mut buffers.strain_rate)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("Strain rate kernel launch failed: {}", e))
})?;
}
}
Ok(())
@@ -325,20 +331,22 @@ impl SmagorinskyGpuModel {
};
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&buffers.strain_rate)
.arg(&buffers.delta)
.arg(&mut buffers.sgs_viscosity)
.arg(&self.constants.cs)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("SGS viscosity kernel launch failed: {}", e))
})?;
unsafe {
self.kernel_manager
.stream()
.launch_builder(&func)
.arg(&buffers.strain_rate)
.arg(&buffers.delta)
.arg(&mut buffers.sgs_viscosity)
.arg(&self.constants.cs)
.arg(&(buffers.nx as i32))
.arg(&(buffers.ny as i32))
.arg(&(buffers.nz as i32))
.launch(config)
.map_err(|e| {
CfdError::gpu_error(&format!("SGS viscosity kernel launch failed: {}", e))
})?;
}
}
self.kernel_manager.synchronize()?;
@@ -356,7 +364,7 @@ impl SmagorinskyGpuModel {
let mut sgs_viscosity_host = vec![0.0f32; n];
self.kernel_manager
.stream
.stream()
.memcpy_dtoh(&buffers.sgs_viscosity, &mut sgs_viscosity_host)
.map_err(|e| {
CfdError::gpu_error(&format!("Failed to copy SGS viscosity from GPU: {}", e))