Syncleus / aparapi

The New Official Aparapi: a framework for executing native Java and Scala code on the GPU.

Home Page:http://aparapi.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[Bounty $20] Break in loop causes kernel to hang

freemo opened this issue · comments

This issue only comes up when run as a main, it doesnt appear to show up when running inside a unit test. The code below provokes the exception every time however if i replace the break statement with a return statement it works fine.

Offending code:

        System.out.println("Preparing...");

        final int toCheck[] = new int[10000];
        for(int i = 0; i < toCheck.length; i++)
            toCheck[i] = i;
        final boolean result[] = new boolean[10000];

        Kernel kernel = new Kernel() {
            @Override
            public void run() {
                int i = getGlobalId();

                if ((toCheck[i] == 2) || (toCheck[i] == 3)) {
                    result[i] = true;
                    return;
                }
                if ((toCheck[i] % 2 == 0) || (toCheck[i] % 3 == 0)) {
                    result[i] = false;
                    return;
                }

                int maxDivisor = (int) Math.sqrt(toCheck[i]);
                int dividendIndex = 1;
                int dividend = 5;
                while (dividend < maxDivisor) {
                    if (toCheck[i] % dividend == 0) {
                        result[i] = false;
                        return;
                    }

                    dividend = dividend + 2;

                    if (dividend > maxDivisor) {
//                        result[i] = true;
//                        return;
                        break;
                    }

                    if (toCheck[i] % dividend == 0) {
                        result[i] = false;
                        return;
                    }

                    dividendIndex++;
                    dividend = 6 * dividendIndex - 1;
                }

                result[i] = true;
            }
        };

        Range range = Range.create(result.length);

        System.out.println("Running...");
        kernel.execute(range);
        for( int i = 0; i< result.length; i++) {
            if(result[i])
                System.out.println(toCheck[i]);
        }
        System.out.println("done.");

        kernel.dispose();

exception thrown:

[WARNING] thread Thread[ForkJoinPool-1-worker-2,1,com.syncleus.grail.Main] was interrupted but is still alive after waiting at least 999msecs
[WARNING] thread Thread[ForkJoinPool-1-worker-2,1,com.syncleus.grail.Main] will linger despite being asked to die via interruption
[WARNING] thread Thread[ForkJoinPool-1-worker-4,1,com.syncleus.grail.Main] will linger despite being asked to die via interruption
[WARNING] thread Thread[ForkJoinPool-1-worker-7,1,com.syncleus.grail.Main] will linger despite being asked to die via interruption
[WARNING] thread Thread[ForkJoinPool-1-worker-0,1,com.syncleus.grail.Main] will linger despite being asked to die via interruption
[WARNING] thread Thread[ForkJoinPool-1-worker-11,1,com.syncleus.grail.Main] will linger despite being asked to die via interruption
[WARNING] NOTE: 5 thread(s) did not finish despite being asked to  via interruption. This is not a problem with exec:java, it is a problem with the running code. Although not serious, it should be remedied.
[WARNING] Couldn't destroy threadgroup org.codehaus.mojo.exec.ExecJavaMojo$IsolatedThreadGroup[name=com.syncleus.grail.Main,maxpri=10]
java.lang.IllegalThreadStateException
	at java.lang.ThreadGroup.destroy(ThreadGroup.java:778)
	at org.codehaus.mojo.exec.ExecJavaMojo.execute(ExecJavaMojo.java:321)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
	at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
	at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
	at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
	at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
	at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)