我跟随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模式下会出现问题。我正在使用带有Windows 10的2013年末macbook pro视网膜。
Edit2:我的计算方法的返回行导致问题。如果我返回Long.MAX_VALUE
,它就可以了。但是(long) tc * 100
(或((long) tc) * 100
)没有给予(例如40681688900)
答案 0 :(得分:2)
我认为您应该检查代码检查Aparapi Java Kernel Guidelines,特别注意其他限制和小心副作用部分。
请记住尽可能简化代码。
查看代码,在calculate
方法中广泛使用模数(%)运算符。我建议你记录每个计算,以便能够比较你在JTP模式下获得的和你在GPU模式下得到的结果,以便找出这个运算符是否存在一些问题。
修改强>
在你的calculate方法中,你使用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值。
答案 1 :(得分:1)
您好我是新Aparapi.com和新github存储库的主要维护者。我们在新项目的家中更加活跃,甚至已经在maven中心发布了大约十几个版本。您可能需要考虑转移到新的Aparapi。
据说我是新Aparapi的开发人员并运行此测试用例并确认它是合法的Aparapi错误。我将研究导致该错误的原因,并希望在下一个版本发布之前为您修复错误。 issue has been reported here如果您想跟踪它。请记住这个新的Aparapi项目,因此错误修复不太可能出现在旧的Aparapi项目中。