Непредсказуемые результаты в расчетах под Cortex-A53
Приведенный ниже код Java возвращает непредсказуемые результаты при запуске на Cortex-A53 и, в частности, на устройствах Xperia XA.
Первые итерации выводят правильные значения:
[24, 42, 61, 45, 29, 46, 35, 36, 48, 47, 20, 64, 45, 15, 37, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70]
и после некоторых повторений он печатает:
[24, 61, 29, 35, 48, 20, 45, 37, 1886962617, 41137, 6952, 58489, 6151, 55208, 154, 57100, 20418, 57100, 20418, 57100, 20418, 57100, 20418, 57100, 20418 57100, 20418, 57100, 20418, 57100, 20418]
Если я использую float
или же double
или же int
вместо long
, результаты все еще неправильные, но разные:
[24,0, 61,0, 29,0, 35,0, 48,0, 20,0, 45,0, 37,0, 1,0, 1,0, 1,0, 1,0, 1,0, 1,0, 1,0, 1,0, 1,0, 1,0, 1,0, 1,0, 1,0, 1,0, 1,0, 1,0, 1,0, 1,0 1,0, 1,0, 1,0, 1,0, 1,0, 1,0]
На других устройствах он работает как положено. Это проблема JVM или она вызвана ошибками процессора?
public static void runTest() {
long[] t = new long[]{ 23,41, 60, 44, 28, 45, 34, 35, 47, 46, 19, 63, 44, 14, 36, 69};
for(int i = 0; i < 40; i++) {
long[] output = calculate(t);
Log.e("TEST", Arrays.toString(output));
}
}
private static long[] calculate(long[] input) {
long[] result = new long[31];
for (int i = 0; i < 16; i ++) {
for (int j = 0; j < 16; j++) {
result[i + j] = input[i] + 1;
}
}
return result;
}
Если я переместить код из calculate
внутри runTest
это за цикл, он работает правильно. Кроме того, если я прочитал input
значения внутри calculate
оно работает.
Итак, что является причиной этой проблемы и где я должен оставить свой отзыв, чтобы решить эту проблему?