Помогите прикрутить OpenCL/GPU

 

Здравствуйте!Помогите пожалуйста разгрузить код.Есть функция,которая много раз повторяется.

Видео карта вроде мощная-должно быть пошустрее...

int FFF(int ts,int f1,int f2,int f3,int f4)
  {
   int seek=0;
   int sig=-1;

   for(int u1=0;u1<=1;u1++)
     {
      for(int u2=0;u2<=1;u2++)
        {
         for(int u3=0;u3<=1;u3++)
           {
            for(int u4=0;u4<=1;u4++)
              {
               seek++;
               if(ts==seek)
                 {
                  if(u1==f1 && u2==f2 && u3==f3 && u4==f4)
                    {
                     sig=0;return(sig);
                    }
                  if(u1!=f1 && u2!=f2 && u3!=f3 && u4!=f4)
                    {
                     sig=1;return(sig);
                    }
                 }
              }
           }
        }
     }
   return(sig);
  }
 
Nikolay Gaylis:

Здравствуйте!Помогите пожалуйста разгрузить код.Есть функция,которая много раз повторяется.

Видео карта вроде мощная-должно быть пошустрее...

У вас 4 вложенных цикла. Можно запустить кернел в 3-мерном пространстве задач, таким образом останется только один цикл. Но в приведённом Вами примере количество запущенных задач (work-items) равно 2*2*2 = 8. Это очень мало. Вы не получите никакого ускорения, только потеряете время на накладных расходах. Чтобы получить прирост производительности относительно CPU, количество задач должно исчисляться миллионами.
 
по ts переменные u1-u4 легко вычисляются, циклов не надо
 
Serhii Shevchuk:
У вас 4 вложенных цикла. Можно запустить кернел в 3-мерном пространстве задач, таким образом останется только один цикл. Но в приведённом Вами примере количество запущенных задач (work-items) равно 2*2*2 = 8. Это очень мало. Вы не получите никакого ускорения, только потеряете время на накладных расходах. Чтобы получить прирост производительности относительно CPU, количество задач должно исчисляться миллионами.

Там получается 16,а не 8.

Данная функция вложена в цикл с 96 000 итерациями.Прирост должен быть существенный.До разгрузки главного цикла может сам дойду,если с этим поможете)

 
TheXpert:
по ts переменные u1-u4 легко вычисляются, циклов не надо

ts от 1 до 16.Подскажите как?

0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
комбинации f на входе
 

ts_ = ts - 1;

u1 = ts_ & 1;

u2 = (ts_ & 2) >> 1;

u3 = (ts_ & 4) >> 2;

u3 = (ts_ & 8) >> 3;

примерно так, за правильность не ручаюсь, лень проверять

ну и думаю можно еще соптимизировать, есть подозрение что эта функция вообще не нужна
 
Nikolay Gaylis:

Там получается 16,а не 8.

Данная функция вложена в цикл с 96 000 итерациями.Прирост должен быть существенный.До разгрузки главного цикла может сам дойду,если с этим поможете)

Пространство задач может иметь максимум 3 измерения. В Вашей ситуации это логично было бы сделать так.

Измерение 0: цикл с 96к итерациями, измерение 1: u1, измерение 2: u2, а циклы u3 и u4 оставить, как есть, в теле кернела. Если от u1-u4 можно уйти, как Вам подсказали, то кернел запускать в одном измерении с количеством задач 96к.

Причина обращения: