11#![ feature( nll) ]
2+ #![ allow( unused_imports) ]
23
34extern crate wyvern_core as wcore;
45extern crate wyvern_vulkan as wvk;
@@ -15,23 +16,48 @@ fn main() {
1516 let program = builder. finalize ( ) . unwrap ( ) ;
1617 let executor = VkExecutor :: new ( Default :: default ( ) ) . unwrap ( ) ;
1718 let mut executable = executor. compile ( program) . unwrap ( ) ;
18- let asd = executor. new_resource ( ) . unwrap ( ) ;
19- let foo = executor. new_resource ( ) . unwrap ( ) ;
20- let bar = executor. new_resource ( ) . unwrap ( ) ;
21- foo . set_data ( TokenValue :: Scalar ( ConstantScalar :: U32 ( 0 ) ) ) ;
22- asd . set_data ( TokenValue :: Scalar ( ConstantScalar :: U32 ( 2 ) ) ) ;
23- bar . set_data ( TokenValue :: Scalar ( ConstantScalar :: U32 ( 21 ) ) ) ;
24- executable. bind ( "foo " , IO :: Output , foo . clone ( ) ) ;
25- executable. bind ( "asd " , IO :: Input , asd . clone ( ) ) ;
26- executable. bind ( "bar " , IO :: Input , asd . clone ( ) ) ;
19+ let in1 = executor. new_resource ( ) . unwrap ( ) ;
20+ let in2 = executor. new_resource ( ) . unwrap ( ) ;
21+ let out = executor. new_resource ( ) . unwrap ( ) ;
22+ in1 . set_data ( TokenValue :: Vector ( ConstantVector :: U32 ( vec ! [ 2 ; 10000 ] ) ) ) ;
23+ in2 . set_data ( TokenValue :: Scalar ( ConstantScalar :: U32 ( 3 ) ) ) ;
24+ out . set_data ( TokenValue :: Scalar ( ConstantScalar :: U32 ( 0 ) ) ) ;
25+ executable. bind ( "out " , IO :: Output , out . clone ( ) ) ;
26+ executable. bind ( "in1 " , IO :: Input , in1 . clone ( ) ) ;
27+ executable. bind ( "in2 " , IO :: Input , in2 . clone ( ) ) ;
2728 executable. run ( ) . unwrap ( ) ;
28- println ! ( "{:?}" , foo . get_data( ) ) ;
29+ println ! ( "{:?}" , out . get_data( ) ) ;
2930}
3031
3132fn program ( builder : & ProgramBuilder ) {
32- let x = Variable :: new ( builder) . mark_as_input ( "asd" ) . load ( ) ;
33- let y = Variable :: new ( builder) . mark_as_input ( "bar" ) . load ( ) ;
34- let a: Constant < u32 > = y * x;
35- let b = Variable :: new ( builder) . mark_as_output ( "foo" ) ;
36- b. store ( a) ;
33+ let zero = Constant :: new ( 0_u32 , builder) ;
34+ let one = Constant :: new ( 1_u32 , builder) ;
35+ let v: Array < u32 > = Array :: new ( zero, 10000 , true , builder) . mark_as_input ( "in1" ) ;
36+ let a: Constant < u32 > = Variable :: new ( builder) . mark_as_input ( "in2" ) . load ( ) ;
37+ let o = Variable :: new ( builder) . mark_as_output ( "out" ) ;
38+ let id = builder. worker_id ( ) ;
39+ let size = builder. num_workers ( ) ;
40+ let tmp: Array < u32 > = Array :: new ( size, 10000 , true , builder) ;
41+ let v_length = v. len ( ) ;
42+ let index = Variable :: new ( builder) ;
43+ index. store ( id) ;
44+ builder. while_loop ( |_| {
45+ index. load ( ) . lt ( v_length)
46+ } , |_| {
47+ let old_value = tmp. at ( id) . load ( ) ;
48+ tmp. at ( id) . store ( old_value + v. at ( index. load ( ) ) . load ( ) * a) ;
49+ index. store ( index. load ( ) + size) ;
50+ } ) ;
51+ builder. memory_barrier ( ) ;
52+ builder. if_then ( |_| {
53+ id. eq ( zero)
54+ } , |_| {
55+ index. store ( zero) ;
56+ builder. while_loop ( |_| {
57+ index. load ( ) . lt ( size)
58+ } , |_| {
59+ o. store ( o. load ( ) + tmp. at ( index. load ( ) ) . load ( ) ) ;
60+ index. store ( index. load ( ) + one) ;
61+ } ) ;
62+ } ) ;
3763}
0 commit comments