From b10dfb6a2bc1ac797a128f3d2928360d8018ca8d Mon Sep 17 00:00:00 2001
From: Pr0methean <4961925+Pr0methean@users.noreply.github.com>
Date: Fri, 15 Jun 2018 17:08:34 -0700
Subject: [PATCH] Increase runtime estimation tolerance to 250ms

---
 .../runtime/ProfileReportNewAPITest.java      | 100 +++++++++---------
 1 file changed, 50 insertions(+), 50 deletions(-)

diff --git a/src/test/java/com/aparapi/runtime/ProfileReportNewAPITest.java b/src/test/java/com/aparapi/runtime/ProfileReportNewAPITest.java
index 21daa4d3..dc75a591 100644
--- a/src/test/java/com/aparapi/runtime/ProfileReportNewAPITest.java
+++ b/src/test/java/com/aparapi/runtime/ProfileReportNewAPITest.java
@@ -55,33 +55,33 @@ import com.aparapi.internal.kernel.KernelManager;
 
 /**
  * Provides integration tests to help in assuring that new APIs for ProfileReports are working,
- * in single threaded and multi-threaded environments. 
- * 
+ * in single threaded and multi-threaded environments.
+ *
  * @author CoreRasurae
  */
 public class ProfileReportNewAPITest {
 
 	private static OpenCLDevice openCLDevice;
-	
+
 	private static Logger logger = Logger.getLogger(Config.getLoggerName());
-	
-	@Rule 
+
+	@Rule
 	public TestName name = new TestName();
 
-	
+
     @After
     public void classTeardown() {
     	Util.resetKernelManager();
     }
 
-	
+
     private class CLKernelManager extends KernelManager {
     	@Override
     	protected List<Device.TYPE> getPreferredDeviceTypes() {
     		return Arrays.asList(Device.TYPE.ACC, Device.TYPE.GPU, Device.TYPE.CPU);
     	}
     }
-    
+
     private class JTPKernelManager extends KernelManager {
     	private JTPKernelManager() {
     		LinkedHashSet<Device> preferredDevices = new LinkedHashSet<Device>(1);
@@ -93,7 +93,7 @@ public class ProfileReportNewAPITest {
     		return Arrays.asList(Device.TYPE.JTP);
     	}
     }
-    
+
     public void setUpBefore() throws Exception {
     	KernelManager.setKernelManager(new CLKernelManager());
         Device device = KernelManager.instance().bestDevice();
@@ -105,9 +105,9 @@ public class ProfileReportNewAPITest {
     }
 
     /**
-     * Tests the ProfileReport observer interface in a single threaded, single kernel environment running on 
+     * Tests the ProfileReport observer interface in a single threaded, single kernel environment running on
      * an OpenCL device.
-     * @throws Exception 
+     * @throws Exception
      */
     @Test
     public void singleThreadedSingleKernelObserverOpenCLTest() throws Exception {
@@ -117,7 +117,7 @@ public class ProfileReportNewAPITest {
     }
 
     /**
-     * Tests the ProfileReport observer interface in a single threaded, single kernel environment running on 
+     * Tests the ProfileReport observer interface in a single threaded, single kernel environment running on
      * Java Thread Pool.
      */
     @Test
@@ -131,7 +131,7 @@ public class ProfileReportNewAPITest {
     	private double accumulatedElapsedTime = 0.0;
     	private long receivedReportsCount = 0;
     }
-    
+
     private class ReportObserver implements IProfileReportObserver {
     	private final ConcurrentSkipListSet<Long> expectedThreadsIds = new ConcurrentSkipListSet<>();
     	private final ConcurrentSkipListMap<Long, ThreadTestState> observedThreadsIds = new ConcurrentSkipListMap<>();
@@ -139,30 +139,30 @@ public class ProfileReportNewAPITest {
     	private final int threads;
     	private final int runs;
     	private final boolean[] receivedReportIds;
-    	
+
     	private ReportObserver(Device _device, int _threads, int _runs) {
     		device = _device;
     		threads = _threads;
     		runs = _runs;
-    	
+
     		receivedReportIds = new boolean[threads * runs];
     	}
-    	
+
     	private void addAcceptedThreadId(long threadId) {
     		expectedThreadsIds.add(threadId);
     	}
-    	
+
     	private ConcurrentSkipListMap<Long, ThreadTestState> getObservedThreadsIds() {
     		return observedThreadsIds;
     	}
-    	    	
+
 		@Override
 		public void receiveReport(Class<? extends Kernel> kernelClass, Device _device, WeakReference<ProfileReport> profileInfoRef) {
 			ProfileReport profileInfo = profileInfoRef.get();
 			assertEquals("Kernel class does not match", Basic1Kernel.class, kernelClass);
 			assertEquals("Device does not match", device, _device);
 			boolean isThreadAccepted = expectedThreadsIds.contains(profileInfo.getThreadId());
-			assertTrue("Thread generating the report (" + profileInfo.getThreadId() + 
+			assertTrue("Thread generating the report (" + profileInfo.getThreadId() +
 					") is not among the accepted ones: " + expectedThreadsIds.toString(), isThreadAccepted);
 			Long threadId = profileInfo.getThreadId();
 			ThreadTestState state = observedThreadsIds.computeIfAbsent(threadId, k -> new ThreadTestState());
@@ -171,15 +171,15 @@ public class ProfileReportNewAPITest {
 			receivedReportIds[(int)profileInfo.getReportId() - 1] = true;
 		}
     }
-    
+
     public boolean singleThreadedSingleKernelReportObserverTestHelper(Device device, int size) {
     	final int runs = 100;
     	final int inputArray[] = new int[size];
     	final Basic1Kernel kernel = new Basic1Kernel();
-    	
+
     	int[] outputArray = null;
     	Range range = device.createRange(size, size);
-    	
+
     	ReportObserver observer = new ReportObserver(device, 1, runs);
     	observer.addAcceptedThreadId(Thread.currentThread().getId());
     	kernel.registerProfileReportObserver(observer);
@@ -187,7 +187,7 @@ public class ProfileReportNewAPITest {
 		for (int i = 0; i < runs; i++) {
 			assertFalse("Report with id " + i + " shouldn't have been received yet", observer.receivedReportIds[i]);
 		}
-    	
+
     	long startOfExecution = System.currentTimeMillis();
     	try {
     		for (int i = 0; i < runs; i++) {
@@ -202,7 +202,7 @@ public class ProfileReportNewAPITest {
 
     		assertEquals("Number of profiling reports doesn't match the expected", runs, state.receivedReportsCount);
     		assertEquals("Aparapi Accumulated execution time doesn't match", kernel.getAccumulatedExecutionTimeAllThreads(device), state.accumulatedElapsedTime, 1e-10);
-    		assertEquals("Test estimated accumulated time doesn't match within 200ms window", runTime, kernel.getAccumulatedExecutionTimeAllThreads(device), 200);
+    		assertEquals("Test estimated accumulated time doesn't match within 250ms window", runTime, kernel.getAccumulatedExecutionTimeAllThreads(device), 250);
     		for (int i = 0; i < runs; i++) {
     			assertTrue("Report with id " + i + " wasn't received", observer.receivedReportIds[i]);
     		}
@@ -211,12 +211,12 @@ public class ProfileReportNewAPITest {
     		kernel.registerProfileReportObserver(null);
     		kernel.dispose();
     	}
-    	
+
     	return true;
     }
 
     /**
-     * Tests the ProfileReport observer interface in a multi threaded, single kernel environment running on 
+     * Tests the ProfileReport observer interface in a multi threaded, single kernel environment running on
      * an OpenCL device.
      */
     @Test
@@ -227,7 +227,7 @@ public class ProfileReportNewAPITest {
     }
 
     /**
-     * Tests the ProfileReport observer interface in a multi threaded, single kernel environment running on 
+     * Tests the ProfileReport observer interface in a multi threaded, single kernel environment running on
      * Java Thread Pool.
      */
     @Test
@@ -244,15 +244,15 @@ public class ProfileReportNewAPITest {
     	private double accumulatedExecutionTime;
     	private int[] outputArray;
     }
-    
+
     @SuppressWarnings("unchecked")
-    public boolean multiThreadedSingleKernelReportObserverTestRunner(final ExecutorService executorService, 
+    public boolean multiThreadedSingleKernelReportObserverTestRunner(final ExecutorService executorService,
     		final List<Basic1Kernel> kernels, final ThreadResults[] results, int[] inputArray, int runs, int javaThreads,
     		final Device device, final ReportObserver observer, int size) throws InterruptedException, ExecutionException {
     	final AtomicInteger atomicResultId = new AtomicInteger(0);
       	boolean terminatedOk = false;
     	try {
-    		List<Future<Runnable>> futures = new ArrayList<>(javaThreads); 
+    		List<Future<Runnable>> futures = new ArrayList<>(javaThreads);
     		for (Basic1Kernel k : kernels) {
 				futures.add((Future<Runnable>)executorService.submit(new Runnable() {
 					@Override
@@ -291,40 +291,40 @@ public class ProfileReportNewAPITest {
             	executorService.shutdownNow();
             }
     	}
-    	
+
     	return terminatedOk;
     }
-    
+
 	public boolean multiThreadedSingleKernelReportObserverTestHelper(Device device, int size) throws InterruptedException, ExecutionException {
     	final int runs = 100;
     	final int javaThreads = 10;
     	final int inputArray[] = new int[size];
     	ExecutorService executorService = Executors.newFixedThreadPool(javaThreads);
-    	
+
     	final ReportObserver observer = new ReportObserver(device, javaThreads, runs);
 
 		for (int i = 0; i < runs; i++) {
 			assertFalse("Report with id " + i + " shouldn't have been received yet", observer.receivedReportIds[i]);
 		}
-    	
+
     	final List<Basic1Kernel> kernels = new ArrayList<Basic1Kernel>(javaThreads);
     	for (int i = 0; i < javaThreads; i++) {
         	final Basic1Kernel kernel = new Basic1Kernel();
         	kernel.registerProfileReportObserver(observer);
         	kernels.add(kernel);
     	}
-    	
+
     	final ThreadResults[] results = new ThreadResults[javaThreads];
     	for (int i = 0; i < results.length; i++) {
     		results[i] = new ThreadResults();
     	}
-    	
-  
-    	boolean terminatedOk = multiThreadedSingleKernelReportObserverTestRunner(executorService, kernels, results, 
+
+
+    	boolean terminatedOk = multiThreadedSingleKernelReportObserverTestRunner(executorService, kernels, results,
     			inputArray, runs, javaThreads, device, observer, size);
-    	
+
     	assertTrue("Threads did not terminate correctly", terminatedOk);
-    
+
     	double allThreadsAccumulatedTime = 0;
     	ConcurrentSkipListMap<Long, ThreadTestState> states = observer.getObservedThreadsIds();
     	assertEquals("Number of Java threads sending profile reports should match the number of JavaThreads", javaThreads, states.values().size());
@@ -339,27 +339,27 @@ public class ProfileReportNewAPITest {
         	assertTrue("Thread index " + i + " kernel computation doesn't match the expected", validateBasic1Kernel(inputArray, results[i].outputArray));
         	assertEquals("Runtime is not within 600ms of the kernel estimated", results[i].runTime, state.accumulatedElapsedTime, 600);
     	}
-    	
-    	assertEquals("Overall kernel execution time doesn't match", 
+
+    	assertEquals("Overall kernel execution time doesn't match",
     			kernels.get(0).getAccumulatedExecutionTimeAllThreads(device), allThreadsAccumulatedTime, 1e10);
-    	
+
     	return true;
     }
-    
+
     private boolean validateBasic1Kernel(final int[] inputArray, final int[] resultArray) {
     	int[] expecteds = Arrays.copyOf(inputArray, inputArray.length);
     	for (int threadId = 0; threadId < inputArray.length; threadId++) {
     		expecteds[threadId] += threadId;
     	}
-    	
+
     	assertArrayEquals(expecteds, resultArray);
-    	
+
     	return true;
     }
 
     private class Basic1Kernel extends Kernel {
     	protected int[] workArray;
-    	
+
     	@NoCL
     	public void setInputOuputArray(int[] array) {
     		workArray = array;
@@ -369,12 +369,12 @@ public class ProfileReportNewAPITest {
     	public int getId() {
     		return 1;
     	}
-    	
+
 		@Override
 		public void run() {
 			int id = getLocalId();
-			
+
 			workArray[id]+=id;
 		}
-    }    
+    }
 }
-- 
GitLab