Все ваши проблемы лежат в этой строке:
result[0] += in1Copy[i] + in2Copy[i];
Самая большая проблема здесь заключается в том, что вы пытаетесь выполнить операцию чтения / записи в одну и ту же область памяти (переменную чтения) из нескольких потоков одновременно,Даже если бы это было разрешено, это привело бы к неожиданным результатам.Вы работаете в среде GPGPU, где хотите минимизировать необходимость блокировки.Это означает, что вам нужно использовать подход типа карты-уменьшения для решения подобных проблем.Для этого вы должны создать реальный массив результатов того же размера, что и in1 и in2.Выполните сложение в этом массиве для каждого потока (шаг карты), затем на втором шаге добавьте все элементы массива вместе (шаг сокращения).
В качестве примечания, исключение, которое вы получаете, не связано с тем, чтоЯ только что упомянул.Скорее всего, проблема в том, что вы работаете в системе, которой просто не хватает памяти.Например, следующее работает на моей машине нормально, за исключением проблемы, о которой я упоминал в предыдущем абзаце (только что проверил).
import com.aparapi.*;
import org.junit.Test;
public class DotProductTest {
@Test
public void dotProduct() {
final double[] in1Copy = new double[4096];
final double[] in2Copy = new double[4096];
for(int i = 0; i < 4096; i++) {
in1Copy[i] = i;
in2Copy[i] = i*10.0;
}
final double[] result = new double[1];
Kernel kernel = new Kernel() {
@Override
public void run() {
int i = getGlobalId();
result[0] += in1Copy[i] + in2Copy[i];
}
};
Range range = Range.create(in1Copy.length);
kernel.execute(range);
System.out.println(result[0]);
}
}