14546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# Copyright (C) 2016 The Android Open Source Project 24546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# 34546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# Licensed under the Apache License, Version 2.0 (the "License"); 44546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# you may not use this file except in compliance with the License. 54546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# You may obtain a copy of the License at 64546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# 74546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# http://www.apache.org/licenses/LICENSE-2.0 84546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# 94546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# Unless required by applicable law or agreed to in writing, software 104546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# distributed under the License is distributed on an "AS IS" BASIS, 114546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# See the License for the specific language governing permissions and 134546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond# limitations under the License. 144546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 154546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondfrom __future__ import absolute_import 164546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 174546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondimport re 184546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondimport itertools 194546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 204546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondfrom harness.test_base_remote import TestBaseRemote 214546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondfrom harness.decorators import ( 224546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ordered_test, 234546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond wimpy, 244546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond skip_conditional, 254546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond) 264546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondfrom harness.assert_mixins import CoordinateAssertionsMixin 274546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 284546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondfrom reduce_common import ( 294546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond REDUCE_SCRIPT, 304546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond REDUCE_AUTO_COMB_SCRIPT, 314546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ReductionMixin, 324546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond) 334546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 344546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 354546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondmultithreaded = lambda: skip_conditional( 364546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond lambda self: self.cpu_count == 1, 374546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond "skipping multithreaded test (1 CPU present)" 384546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond) 394546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 404546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 414546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummondclass TestReduceCombinerMultithreaded( 424546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond TestBaseRemote, CoordinateAssertionsMixin, ReductionMixin): 434546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond """ 444546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond RenderScript reduction combiners are currently run only on the output of a 454546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond parallel reduction step for the CPU reference implementation. These 464546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond testcases test LLDB's handling of breakpoints for the combiner function. 474546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond """ 484546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 494546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond bundle_target = { 504546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 'java': 'Reduction', 514546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond } 524546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 534546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond def _delete_breakpoints(self): 544546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond try: 554546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond self.do_command('breakpoint delete -f') 564546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond except self.TestFail: 574546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond pass 584546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 594546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond def setup(self, android): 604546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond """ 614546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond This test *must* be run on multiple threads, and is skipped if the 624546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond device does not support multiple threads 634546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond """ 644546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond cpu_spec = android.shell("cat /sys/devices/system/cpu/online").strip() 654546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond match = re.search(r'(^0(-\d+)?(,\d+([-]\d*)?)*)$', cpu_spec) 664546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond if not match or not match.groups(): 674546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond raise self.TestFail( 684546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond "unable to parse number of available CPUs in %r" % cpu_spec) 694546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 704546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond def parse_range(s): 714546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond r = s.split('-') 724546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond if len(r) == 1: 734546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond return 1 744546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond return int(r[1]) - int(r[0]) 754546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 764546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond self.cpu_count = sum(map(parse_range, cpu_spec.split(','))) 774546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond android.push_prop('debug.rs.max-threads', self.cpu_count + 1) 784546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 794546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond def teardown(self, android): 804546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond """Reset the number of RS threads to the previous value.""" 814546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond android.pop_prop('debug.rs.max-threads') 824546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 834546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond @multithreaded() 844546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond @ordered_test(0) 854546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond @wimpy 864546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond def test_setup(self): 874546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond self.try_command('language renderscript status', []) 884546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond # first point of order: make sure the compiled script is properly 894546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond # loaded and that we can set a breakpoint on the named reduction 904546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond self.try_command( 914546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 'language renderscript reduction breakpoint set find_min_user_type_auto_comb') 924546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond self.try_command( 934546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 'process continue', 944546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond expected_regex=[ 954546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond r'Process \d+ stopped', 96506520732420b196f4f17d67596fd81004faf009Luke Drummond r'frame #0: (0x[0-9a-fA-F]+ )?librs.reduce_auto_comb.so`' 974546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ] 984546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ) 994546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 1004546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond @multithreaded() 1014546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond def test_function_role_breakpoints_combinations(self): 1024546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond func_role_combinations = itertools.combinations( 1034546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ('accumulator', 'outconverter', 'initializer', 'combiner'), 1044546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond r=2 1054546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ) 1064546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond self._test_func_role_combinations(func_role_combinations) 1074546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 1084546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond @multithreaded() 1094546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond def test_reduction_breakpoint_set_single_type_user_comb(self): 1104546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond return self._reduction_breakpoint_set_single_type( 1114546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 'reduce', 1124546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond REDUCE_SCRIPT, 1134546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 'find_min_user_type', 1144546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ( 1154546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ('find_min_user_type_init', 'initializer'), 1164546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ('find_min_user_type_accum', 'accumulator'), 1174546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ('find_min_user_type_comb', 'combiner'), 1184546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ('find_min_user_type_outc', 'outconverter') 1194546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ) 1204546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ) 1214546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 1224546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond @multithreaded() 1234546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond def test_reduction_breakpoint_set_single_type_auto_comb(self): 1244546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond return self._reduction_breakpoint_set_single_type( 1254546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 'reduce_auto_comb', 1264546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond REDUCE_AUTO_COMB_SCRIPT, 1274546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond 'find_min_user_type_auto_comb', 1284546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ( 1294546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ('find_min_user_type_init', 'initializer'), 1304546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ('find_min_user_type_accum', 'accumulator'), 1314546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ('find_min_user_type_accum.combiner', 'combiner'), 1324546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ('find_min_user_type_outc', 'outconverter') 1334546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ) 1344546f4b74db2655d36b2e19d1e839d7ef37cb27cLuke Drummond ) 135