aparapi: [Bounty $50] Inconsistent results between GPU and CPU when integers overflow.

The following code produces different results when run on the GPU vs the CPU.

import com.aparapi.*;

public class Main {
    public static void main(String[] args) {
        int num = 1;

        final long[] result = new long[num];
        final int start = Integer.MAX_VALUE;

        Kernel kernel = new Kernel() {
            @Override
            public void run() {
                final int id = getGlobalId();
                result[id] = calculate(start + id);
            }
        };
        kernel.execute(num);

        System.out.println( "expected: " +  calculate(start) + " result: " + result[0]);
    }

    public static long calculate(int tc) {
        return (long) tc * 100;
    }
}

The output from the above code snippet is:

expected: 214748364700 result: 4294967196

I tested this on my Macbook pro but others noticed the problem as well on other unspecified platforms. Also changin the calculate function such that 100 is a long rather than an integer with return (long) tc * 100l; (notice the letter l at the end of the 100) will produce the exact same incorrect results as above.

About this issue

  • Original URL
  • State: open
  • Created 8 years ago
  • Comments: 62 (26 by maintainers)

Most upvoted comments

@grfrost If I am correct, why (long) tc + 212600881053l; line works but (long) tc * 100; not?

I doubt. even original OpenCl does not produce correct results. Check my kernel above.