cubecl_spirv/
sync.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use cubecl_core::ir::Synchronization;
use rspirv::spirv::{MemorySemantics, Scope};

use crate::{SpirvCompiler, SpirvTarget};

impl<T: SpirvTarget> SpirvCompiler<T> {
    pub fn compile_sync(&mut self, sync: Synchronization) {
        match sync {
            Synchronization::SyncUnits => {
                // Adopting wgpu semantics
                let scope = self.const_u32(Scope::Workgroup as u32);
                let semantics =
                    MemorySemantics::ACQUIRE_RELEASE | MemorySemantics::WORKGROUP_MEMORY;
                let semantics = self.const_u32(semantics.bits());
                self.control_barrier(scope, scope, semantics).unwrap();
            }
            Synchronization::SyncStorage => {
                // Adopting wgpu semantics
                let scope_exec = self.const_u32(Scope::Workgroup as u32);
                let scope_mem = self.const_u32(Scope::Device as u32);
                let semantics = MemorySemantics::ACQUIRE_RELEASE | MemorySemantics::UNIFORM_MEMORY;
                let semantics = self.const_u32(semantics.bits());
                self.control_barrier(scope_exec, scope_mem, semantics)
                    .unwrap();
            }
        }
    }
}