Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Aparapi data types

Tags:

java

aparapi

I have following code for studying.

My calculate function produces unexpected results when runs on aparapi.

Is there any problem with my code, or aparapi?

Results are;

Result      Num         Expected
2026982348  406816880   40681688012
2026982516  406816881   40681688180
2026982594  406816882   40681688258
2026982662  406816883   40681688326
2026982830  406816884   40681688494
2026982898  406816885   40681688562
2026982966  406816886   40681688630
2026983044  406816887   40681688708
2026983212  406816888   40681688876
2026983280  406816889   40681688944
2026983338  406816890   40681689002
2026983506  406816891   40681689170
2026983584  406816892   40681689248
2026983652  406816893   40681689316
2026983820  406816894   40681689484
2026983888  406816895   40681689552
2026983956  406816896   40681689620
2026984134  406816897   40681689798
2026984202  406816898   40681689866
2026984270  406816899   40681689934

Edit: If I set executionMode JTP or CPU, I get true results (result == expected) but on GPU mode there is a problem. I'm using late 2013 macbook pro retina with windows 10.

Edit2: Return line of my calculate method causes the problem. If I return Long.MAX_VALUE, it works. But (long) tc * 100 (or ((long) tc) * 100) not giving (eg. 40681688900)

like image 322
Hyperion Avatar asked Apr 21 '16 20:04

Hyperion


2 Answers

I think you should review your code checking against Aparapi Java Kernel Guidelines, expecially paying attention to Other restrictions and Beware Of Side Effects sections.

Remember to keep your code as simpler as you can.

Looking to your code, in the calculate method you make wide use of the modulus (%) operator. I would suggest you to log each calculation in order to be able to compare what you get in JTP mode and what you get in GPU mode, in order to find out if there are some issues with this operator.

EDIT: In your calculate method you use int variables to hold values, which may hold numbers till 2^31-1, namely 2147483647 as known as Integer.MAX_VALUE. If you perform int value=2147483647; value++; you will get as a result -2147483648 as known as Integer.MIN_VALUE.

You can alternatively try your program with lower starting numbers or change your variable declarations to long, which may hold Long.MAX_VALUE, namely 2^63-1.

Both long and int values are supported by Aparapi.

like image 188
abarisone Avatar answered Nov 20 '22 12:11

abarisone


Hi I'm the primary maintainer over at the new Aparapi.com and new github repository. We are much more active over at the new project home and even have about a dozen releases in maven central already. You might want to consider moving over to the new Aparapi.

With that said I am a developer at the new Aparapi and ran this test case and confirmed it is a legitimate Aparapi bug. I will look into what is causing the bug and hopefully can get a bug fix in for you before the next release. The issue has been reported here if you would like to track it. Remember this for the new Aparapi project so the bug fix is not likely to show up in the older Aparapi project.

like image 1
Jeffrey Phillips Freeman Avatar answered Nov 20 '22 13:11

Jeffrey Phillips Freeman