2014-01-24 3 views
2

Opencl не поддерживает рекурсивные функции, но охватывает ли это также и косвенные версии?OpenCL и непрямая рекурсия

void recursiveA(int *a,int b) // call this first to start recursion 
{ 
    a[b]=3; 
    if(b<10) 
    { 
     recursiveB(a,b+1); // A calls B 
    } 
} 


void recursiveB(int *a, int b) 
{ 
    a[b]=3; 
    if(b<10) 
    { 
     recursiveA(a,b+1); // B calls A while A still not finished before 
          // and entry point & arguments of A are corrupt ? 
    } 

} 

вместо

void recurse(int *a, int b) 
{ 
    a[b]=3; 
    if(b<10) 
    { 
     recurse(a,b+1); // some OpenCL devices does not have the ability so this is not 
         // possible in OpenCL 
    } 

} 

Итак, мы можем вызвать функцию "R" из другой функции, даже если первый "R" не закончена? Эти функции используют одни и те же постоянные адреса для аргументов каждый раз, когда мы их называем? Должен ли я использовать пользовательскую реализацию «стека» для выполнения косвенной рекурсии до тех пор, пока не будет выпущен Opencl 2.0?

ответ

7

OpenCL не поддерживает рекурсивный поток управления, который включает в себя взаимную рекурсию. Поэтому, чтобы убедиться, что ваш код работает правильно на каждой платформе, вы можете настроить таргетинг, вы должны воздерживаться от использования любой формы рекурсии и вместо этого писать свои алгоритмы с использованием итеративного подхода.

На практике компиляторы OpenCL могут обрабатывать определенные рекурсивные алгоритмы просто отлично. Например, если ваша функция выведена из хвоста, то компилятор может создать невоспроизводимую форму, применяя стандартные методы оптимизации хвоста. Я только что попробовал второй рекурсивный фрагмент кода, который вы опубликовали, и он был принят несколькими компиляторами OpenCL. Первый фрагмент кода заставил их всех сбой, что указывает на то, что они не смогли применить необходимые преобразования, чтобы избежать рекурсивных вызовов (хотя ясно, что они должны приводить к соответствующему сообщению об ошибке, а не к сбою).

Таким образом, вы можете избежать простой рекурсии с некоторыми реализациями OpenCL, но для максимальной переносимости на разных платформах я настоятельно рекомендую вам избежать этого.

Смежные вопросы