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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Nikolay Gaylis
16094
Nikolay Gaylis  

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

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

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);
  }
Serhii Shevchuk
6420
Serhii Shevchuk  
Nikolay Gaylis:

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

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

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

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

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

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

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

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

ts_ = ts - 1;

u1 = ts_ & 1;

u2 = (ts_ & 2) >> 1;

u3 = (ts_ & 4) >> 2;

u3 = (ts_ & 8) >> 3;

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

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

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

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

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

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий