@@ -11,7 +11,7 @@ fn bytes_as_slice<T>(v: &[u8]) -> &[T] {
11
11
unsafe { std:: slice:: from_raw_parts ( v. as_ptr ( ) as * const T , v. len ( ) / mem:: size_of :: < T > ( ) ) }
12
12
}
13
13
14
- async fn steps_many ( numbers : & [ u32 ] ) -> Vec < u32 > {
14
+ async fn steps_many ( numbers : & [ u32 ] ) -> u32 {
15
15
let instance = wgpu:: Instance :: new ( wgpu:: Backends :: all ( ) ) ;
16
16
let adapter = instance
17
17
. request_adapter ( & wgpu:: RequestAdapterOptions {
@@ -62,8 +62,8 @@ async fn steps_many(numbers: &[u32]) -> Vec<u32> {
62
62
} ) ;
63
63
64
64
const BLOCK_SIZE : u32 = 16 ;
65
- let mut n = numbers. len ( ) as u32 / BLOCK_SIZE ;
66
- while n > 0 {
65
+ let mut n = numbers. len ( ) as u32 ;
66
+ while n >= BLOCK_SIZE {
67
67
println ! ( "Iter: {n}" ) ;
68
68
69
69
let mut command_encoder = device. create_command_encoder ( & wgpu:: CommandEncoderDescriptor {
@@ -88,10 +88,10 @@ async fn steps_many(numbers: &[u32]) -> Vec<u32> {
88
88
let mut command_encoder = device. create_command_encoder ( & wgpu:: CommandEncoderDescriptor {
89
89
label : Some ( "my command encoder" ) ,
90
90
} ) ;
91
- command_encoder. copy_buffer_to_buffer ( & storage_buffer, 0 , & staging_buffer, 0 , number_buf_size ) ;
91
+ command_encoder. copy_buffer_to_buffer ( & storage_buffer, 0 , & staging_buffer, 0 , n as u64 * 4 ) ;
92
92
queue. submit ( Some ( command_encoder. finish ( ) ) ) ;
93
93
94
- let buffer_slice = staging_buffer. slice ( ..) ;
94
+ let buffer_slice = staging_buffer. slice ( ..n as u64 * 4 ) ;
95
95
let buffer_future = buffer_slice. map_async ( wgpu:: MapMode :: Read ) ;
96
96
97
97
device. poll ( wgpu:: Maintain :: Wait ) ;
@@ -101,22 +101,16 @@ async fn steps_many(numbers: &[u32]) -> Vec<u32> {
101
101
}
102
102
103
103
let data = buffer_slice. get_mapped_range ( ) ;
104
- let result = bytes_as_slice ( & data) . to_vec ( ) ;
104
+ let result: u32 = bytes_as_slice :: < u32 > ( & data) . iter ( ) . sum ( ) ;
105
105
mem:: drop ( data) ;
106
106
staging_buffer. unmap ( ) ;
107
107
108
108
result
109
109
}
110
110
111
111
fn main ( ) {
112
- let numbers: Vec < u32 > = ( 1 ..=256 ) . collect ( ) ;
113
- let steps = futures_lite:: future:: block_on ( steps_many ( & numbers) ) ;
114
-
115
- for step in steps. into_iter ( ) . take ( 32 ) {
116
- if step == u32:: MAX {
117
- println ! ( "overflow" ) ;
118
- } else {
119
- println ! ( "{step}" ) ;
120
- }
121
- }
112
+ let numbers: Vec < u32 > = ( 1 ..=128 ) . collect ( ) ;
113
+ let sum = futures_lite:: future:: block_on ( steps_many ( & numbers) ) ;
114
+
115
+ println ! ( "{sum}" ) ;
122
116
}
0 commit comments