17fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni/* 27fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * Copyright (C) 2015 The Android Open Source Project 37fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * 47fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 57fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * in compliance with the License. You may obtain a copy of the License at 67fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * 77fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * http://www.apache.org/licenses/LICENSE-2.0 87fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * 97fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * Unless required by applicable law or agreed to in writing, software distributed under the License 107fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 117fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * or implied. See the License for the specific language governing permissions and limitations under 127fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni * the License. 137fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni */ 147fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 157fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Nipackage com.android.rs.test; 167fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 177fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Niimport android.content.Context; 187fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Niimport android.content.res.Resources; 197fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Niimport android.renderscript.*; 207fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Niimport android.util.Log; 217fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Niimport java.lang.Thread; 227fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Niimport java.util.HashMap; 237fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 247fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Nipublic class UT_script_group2_gatherscatter extends UnitTest { 257fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni private Resources mRes; 267fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 277fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni private static final int ARRAY_SIZE = 256; 287fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 297fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni private static final String TAG = "ScriptGroup2 (GatherScatter)"; 307fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 317fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni int[] mArray; 327fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 337fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni protected UT_script_group2_gatherscatter(RSTestCore rstc, Resources res, Context ctx) { 347fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni super(rstc, TAG, ctx); 357fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni mRes = res; 367fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni } 377fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 387fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni public void initializeGlobals(RenderScript RS, ScriptC_addup s) { 397fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni mArray = new int[ARRAY_SIZE * 4]; 407fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 417fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni for (int i = 0; i < ARRAY_SIZE; i++) { 427fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni mArray[i*4] = i * 7; 437fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni mArray[i*4 + 1] = i * 7 + 1; 447fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni mArray[i*4 + 2] = i * 7 + 2; 457fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni mArray[i*4 + 3] = i * 7 + 3; 467fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni } 477fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni } 487fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 497fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni // This test tests ScriptGroup2 API for handling gather scatter operations 507fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni // on global allocations that are passed across kernels in a script group. 517fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni // The test sums up all elements in the input int4 array of size ARRAY_SIZE. 527fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni // To do so, it adds up the second half of the array to its first half using 537fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni // kernel function add() in addsup.rs, and then repeatedly applies the same 547fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni // kernel function to the shrinking result arrays until the result is a 557fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni // single int4 value. 567fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni // These steps are created as a script group by repeatedly adding the 577fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni // same kernel function, with the input of one kernel being the output of 587fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni // the previous added kernel function. 597fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni // Since the kernel function relies on rsGetElementAt to access the counterpart 607fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni // of the current element in the second half of the array, the compiler cannot 617fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni // fuse it with the other kernel that it dependes on. 627fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni // This test verifies an ScriptGroup2 implementation correctly handles such 637fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni // a case. 647fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni public void run() { 657fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni RenderScript pRS = RenderScript.create(mCtx); 667fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni ScriptC_addup s = new ScriptC_addup(pRS); 677fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni pRS.setMessageHandler(mRsMessage); 687fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni initializeGlobals(pRS, s); 697fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 707fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni Allocation input = Allocation.createSized(pRS, Element.I32_4(pRS), ARRAY_SIZE); 717fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni input.copyFrom(mArray); 727fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 73bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni ScriptGroup.Builder2 builder = new ScriptGroup.Builder2(pRS); 747fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 75bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni ScriptGroup.Input unbound = builder.addInput(); 767fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 77bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni ScriptGroup.Closure c = null; 78bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni ScriptGroup.Future f = null; 797fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni int stride; 807fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni for (stride = ARRAY_SIZE / 2; stride >= 1; stride >>= 1) { 81bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni ScriptGroup.Binding binding; 827fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni if (f == null) { 83bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni binding = new ScriptGroup.Binding(s.getFieldID_a_in(), unbound); 847fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni } else { 85bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni binding = new ScriptGroup.Binding(s.getFieldID_a_in(), f); 867fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni } 877fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni c = builder.addKernel(s.getKernelID_add(), 887fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni Type.createX(pRS, Element.I32_4(pRS), stride), 89bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni new ScriptGroup.Binding(s.getFieldID_reduction_stride(), stride), 908e607f39757174d088cbc9703ef051b378c6018fYang Ni binding); 917fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni f = c.getReturn(); 927fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni } 937fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 94bef00fb73762f13d6e3074effe9f6f30c03eeeb0Yang Ni ScriptGroup group = builder.create("Summation", c.getReturn()); 957fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 967fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni if (c == null) { 977fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni return; 987fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni } 997fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 1007fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni int[] a = new int[4]; 1017fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni ((Allocation)group.execute(input)[0]).copyTo(a); 1027fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 1037fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni pRS.finish(); 1047fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni pRS.destroy(); 1057fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni 1067fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni boolean failed = false; 1077fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni for (int i = 0; i < 4; i++) { 1087fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni if (failed == false && 1097fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni a[i] != ARRAY_SIZE * (ARRAY_SIZE - 1) * 7 / 2 + i * ARRAY_SIZE) { 1107fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni Log.e(TAG, "a["+i+"]="+a[i]+", should be "+ 1117fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni (ARRAY_SIZE * (ARRAY_SIZE - 1) * 7 / 2 + i * ARRAY_SIZE)); 1127fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni failed = true; 1137fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni } 1147fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni } 1157fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni if (failed) { 1167fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni failTest(); 1177fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni return; 1187fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni } 1197fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni passTest(); 1207fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni } 1217fa7a5b18fe3f693ab1ca43de70937440759bdbdYang Ni} 122