@@ -4,15 +4,20 @@ mod intrinsic;
4
4
mod json_parser;
5
5
mod types;
6
6
7
+ use std:: fs:: File ;
8
+
9
+ use rayon:: prelude:: * ;
10
+
11
+ use crate :: arm:: config:: POLY128_OSTREAM_DEF ;
7
12
use crate :: common:: SupportedArchitectureTest ;
8
13
use crate :: common:: cli:: ProcessedCli ;
9
14
use crate :: common:: compare:: compare_outputs;
10
- use crate :: common:: gen_c:: compile_c_programs ;
15
+ use crate :: common:: gen_c:: { write_main_cpp , write_mod_cpp } ;
11
16
use crate :: common:: gen_rust:: compile_rust_programs;
12
17
use crate :: common:: intrinsic:: { Intrinsic , IntrinsicDefinition } ;
13
18
use crate :: common:: intrinsic_helpers:: TypeKind ;
14
- use crate :: common:: write_file:: { write_c_testfiles , write_rust_testfiles} ;
15
- use config:: { AARCH_CONFIGURATIONS , F16_FORMATTING_DEF , POLY128_OSTREAM_DEF , build_notices} ;
19
+ use crate :: common:: write_file:: write_rust_testfiles;
20
+ use config:: { AARCH_CONFIGURATIONS , F16_FORMATTING_DEF , build_notices} ;
16
21
use intrinsic:: ArmIntrinsicType ;
17
22
use json_parser:: get_neon_intrinsics;
18
23
@@ -21,6 +26,13 @@ pub struct ArmArchitectureTest {
21
26
cli_options : ProcessedCli ,
22
27
}
23
28
29
+ fn chunk_info ( intrinsic_count : usize ) -> ( usize , usize ) {
30
+ let available_parallelism = std:: thread:: available_parallelism ( ) . unwrap ( ) . get ( ) ;
31
+ let chunk_size = intrinsic_count. div_ceil ( Ord :: min ( available_parallelism, intrinsic_count) ) ;
32
+
33
+ ( chunk_size, intrinsic_count. div_ceil ( chunk_size) )
34
+ }
35
+
24
36
impl SupportedArchitectureTest for ArmArchitectureTest {
25
37
fn create ( cli_options : ProcessedCli ) -> Box < Self > {
26
38
let a32 = cli_options. target . contains ( "v7" ) ;
@@ -51,24 +63,58 @@ impl SupportedArchitectureTest for ArmArchitectureTest {
51
63
}
52
64
53
65
fn build_c_file ( & self ) -> bool {
54
- let target = & self . cli_options . target ;
55
66
let c_target = "aarch64" ;
67
+ let platform_headers = & [ "arm_neon.h" , "arm_acle.h" , "arm_fp16.h" ] ;
56
68
57
- let intrinsics_name_list = write_c_testfiles (
58
- & self
59
- . intrinsics
60
- . iter ( )
61
- . map ( |i| i as & dyn IntrinsicDefinition < _ > )
62
- . collect :: < Vec < _ > > ( ) ,
63
- target,
69
+ let ( chunk_size, chunk_count) = chunk_info ( self . intrinsics . len ( ) ) ;
70
+
71
+ let cpp_compiler = compile:: build_cpp_compilation ( & self . cli_options ) . unwrap ( ) ;
72
+
73
+ let notice = & build_notices ( "// " ) ;
74
+ self . intrinsics
75
+ . par_chunks ( chunk_size)
76
+ . enumerate ( )
77
+ . map ( |( i, chunk) | {
78
+ let c_filename = format ! ( "c_programs/mod_{i}.cpp" ) ;
79
+ let mut file = File :: create ( & c_filename) . unwrap ( ) ;
80
+ write_mod_cpp ( & mut file, notice, c_target, platform_headers, chunk) . unwrap ( ) ;
81
+
82
+ // compile this cpp file into a .o file
83
+ let output = cpp_compiler
84
+ . compile_object_file ( & format ! ( "mod_{i}.cpp" ) , & format ! ( "mod_{i}.o" ) ) ?;
85
+ assert ! ( output. status. success( ) ) ;
86
+
87
+ Ok ( ( ) )
88
+ } )
89
+ . collect :: < Result < ( ) , std:: io:: Error > > ( )
90
+ . unwrap ( ) ;
91
+
92
+ let mut file = File :: create ( "c_programs/main.cpp" ) . unwrap ( ) ;
93
+ write_main_cpp (
94
+ & mut file,
64
95
c_target,
65
- & [ "arm_neon.h" , "arm_acle.h" , "arm_fp16.h" ] ,
66
- & build_notices ( "// " ) ,
67
- & [ POLY128_OSTREAM_DEF ] ,
68
- ) ;
96
+ POLY128_OSTREAM_DEF ,
97
+ self . intrinsics . iter ( ) . map ( |i| i. name . as_str ( ) ) ,
98
+ )
99
+ . unwrap ( ) ;
100
+
101
+ // compile this cpp file into a .o file
102
+ info ! ( "compiling main.cpp" ) ;
103
+ let output = cpp_compiler
104
+ . compile_object_file ( "main.cpp" , "intrinsic-test-programs.o" )
105
+ . unwrap ( ) ;
106
+ assert ! ( output. status. success( ) ) ;
107
+
108
+ let object_files = ( 0 ..chunk_count)
109
+ . map ( |i| format ! ( "mod_{i}.o" ) )
110
+ . chain ( [ "intrinsic-test-programs.o" . to_owned ( ) ] ) ;
111
+
112
+ let output = cpp_compiler
113
+ . link_executable ( object_files, "intrinsic-test-programs" )
114
+ . unwrap ( ) ;
115
+ assert ! ( output. status. success( ) ) ;
69
116
70
- let pipeline = compile:: build_cpp_compilation ( & self . cli_options ) . unwrap ( ) ;
71
- compile_c_programs ( & pipeline, & intrinsics_name_list)
117
+ true
72
118
}
73
119
74
120
fn build_rust_file ( & self ) -> bool {
0 commit comments