我关注 code学习。
我的计算函数在 aparapi 上运行时产生了意外的结果。
我的代码或 aparapi 有什么问题吗?
结果是;
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
编辑:如果我设置 executionMode JTP 或 CPU,我会得到真实结果(结果 == 预期)但在 GPU 模式下会出现问题。我正在使用 2013 年末的 macbook pro retina 和 windows 10。
Edit2:我的计算方法的返回行导致了问题。如果我返回 Long.MAX_VALUE
,它会起作用。但是 (long) tc * 100
(或 ((long) tc) * 100
)不给(例如 40681688900)
最佳答案
我认为您应该根据 Aparapi Java Kernel Guidelines 查看您的代码检查,特别注意其他限制和注意副作用部分。
请记住让您的代码尽可能简单。
查看您的代码,您在 calculate
方法中广泛使用了模数 (%) 运算符。我建议您记录每个计算,以便能够比较在 JTP 模式下获得的结果和在 GPU 模式下获得的结果,从而找出此运算符是否存在问题。
编辑:
在您的计算方法中,您使用 int 变量来保存值,这些值可以保存数字直到 2^31-1,即 2147483647,称为 Integer.MAX_VALUE。
如果执行 int value=2147483647; value++;
结果是 -2147483648,即 Integer.MIN_VALUE。
您也可以使用较低的起始数字尝试您的程序,或者将您的变量声明更改为 long,它可能包含 Long.MAX_VALUE,即 2^63-1。
Aparapi 支持 long 和 int 值。
关于java - Aparapi 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36780079/