Простой расчет не соответствует результату

#java #aparapi

Вопрос:

Я запустил «Поиск простых чисел путем выполнения кода на GPU» по следующей ссылке https://www.logicbig.com/tutorials/misc/gpu-programming/aparapi/intro-with-example.html, но я исправил это, чтобы оно работало изменилось на 500 000.

Когда я запускаю это много раз, результаты разные. Порядковые номера[499901], иногда это ложь, а иногда это правда.

Код-это:

 import com.aparapi.Kernel;
import java.util.Arrays;
import java.util.stream.IntStream;
import com.aparapi.Range;

public class GpuExample {
  public static void main(String[] args) {
      final int size = 500000;
      final int[] a = IntStream.range(2, size   2).toArray();
      final boolean[] primeNumbers = new boolean[size];

      Kernel kernel = new Kernel() {
          @Override
          public void run() {
              int gid = getGlobalId();
              int num = a[gid];
              boolean prime = true;
              for (int i = 2; i < num; i  ) {
                  if (num % i == 0) {
                      prime = false;
                      //break is not supported
                  }
              }
              primeNumbers[gid] = prime;
          }
      };
      long startTime = System.currentTimeMillis();
      Range range = Range.create(size);
      kernel.execute(range);

      System.out.printf("time taken: %s ms%n", System.currentTimeMillis() - startTime);
      System.out.println("a[499901]=" a[499901] " should be a prime number!");
      System.out.println("result primeNumbers[499901]=" primeNumbers[499901]);
      kernel.dispose();
  }
}
 

компиляция-это:
javac -g -classpath aparapi-3.0.0.jar;aparapi-jni-1.4.3.jar;bcel-6.5.0.jar;scala-library-2.13.6.jar;*; GpuExample.java

а исполнение-это: java -classpath aparapi-3.0.0.jar;aparapi-jni-1.4.3.jar;bcel-6.5.0.jar;scala-library-2.13.6.jar;*; GpuExample

Есть идеи, почему это непоследовательно?

Результаты:

 java -classpath aparapi-3.0.0.jar;aparapi-jni-1.4.3.jar;bcel-6.5.0.jar;scala-library-2.13.6.jar;*; GpuExample
Oct. 08, 2021 3:35:38 PM com.aparapi.internal.model.ClassModel$AttributePool <init>
WARNING: Found unexpected Attribute (name = NestHost)
time taken: 14461 ms
a[499901]=499903 should be a prime number!
result primeNumbers[499901]=true

java -classpath aparapi-3.0.0.jar;aparapi-jni-1.4.3.jar;bcel-6.5.0.jar;scala-library-2.13.6.jar;*; GpuExample
Oct. 08, 2021 3:35:54 PM com.aparapi.internal.model.ClassModel$AttributePool <init>
WARNING: Found unexpected Attribute (name = NestHost)
time taken: 13675 ms
a[499901]=499903 should be a prime number!
result primeNumbers[499901]=false               <---------------  ???????????
 

Дополнительная информация: под управлением Windows 10 мой графический процессор-это графика AMD Radeon Vega 8. Я также пытался продолжить только тогда, когда флаг primeNumbers был установлен в значение true, и могу подтвердить, что это не сработало (иногда никогда не устанавливалось в значение true). Я подозреваю, что некоторые инструкции не выполняются на GPU.

сгенерированный OpenCL (с использованием-Dcom.aparapi.enableShowGeneratedOpenCL=true)

 typedef struct This_s{
   __global int *val$a;
   __global char  *val$primeNumbers;
   int passid;
}This;
int get_pass_id(This *this){
   return this->passid;
}
__kernel void run(
   __global int *val$a, 
   __global char  *val$primeNumbers, 
   int passid
){
   This thisStruct;
   This* this=amp;thisStruct;
   this->val$a = val$a;
   this->val$primeNumbers = val$primeNumbers;
   this->passid = passid;
   {
      int gid = get_global_id(0);
      int num = this->val$a[gid];
      char prime = 1;
      for (int i = 2; i<num; i  ){
         if ((num % i)==0){
            prime = 0;
         }
      }
      this->val$primeNumbers[gid]  = prime;
      return;
   }
}
 

Комментарии:

1. Я не знаком с aparapi, но будет ли вычисление завершено, когда kernel.execute(range) вернется, или вам нужно подождать?

2. Я бы ожидал, что он должен блокироваться до тех пор, пока kernel.execute не завершится. это мое понимание.

3. Марк. Я ответил некоторыми предложениями на сайте aparapi gitter. Для контекста здесь я не могу воспроизвести несоответствие. Я всегда вижу 499903 как простой (как и должно быть). У меня есть более старая карта AMD. Я также взял OpenCL, созданный Aparapi, и выполнил с тем же результатом. Также увидел правильное использование с использованием POCL и реализаций OpenCL на базе процессоров Intel. Вы можете использовать-Dcom.aparapi.enableShowGeneratedOpenCL=true Для создания OpenCL. Я подозреваю, что это проблема с извлечением массива булов с устройства. Я могу показать вам, как взломать Aparapi JNI для диагностики, если вы хотите

4. О, и да, Aparapi блокируется до тех пор, пока не будет завершено выполнение и все передачи данных с устройства. Так что ваше предположение верно.

5. Я рад взломать Aparapi JNI для диагностики.. Я рад помочь всем, чем могу.