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?
1 ответ:
OpenCL не поддерживает рекурсивный поток управления, который включает взаимную рекурсию. Поэтому, чтобы убедиться, что ваш код работает должным образом на каждой платформе, которую вы хотите использовать, вы должны воздержаться от использования любой формы рекурсии и вместо этого написать свои алгоритмы, используя итерационный подход.
На практике компиляторы OpenCL могут прекрасно справляться с некоторыми рекурсивными алгоритмами. Например, если ваша функция является хвостовой рекурсией, то компилятор может создать нерекурсивную функцию. форма путем применения стандартных методов оптимизации хвостового вызова. Я только что попробовал второй рекурсивный фрагмент кода, который вы опубликовали, и он был принят несколькими компиляторами OpenCL. Первый фрагмент кода вызвал их сбой, что указывает на то, что они не смогли применить необходимые преобразования, чтобы избежать рекурсивных вызовов (хотя ясно, что они должны выдавать соответствующее сообщение об ошибке, а не сбой).
Таким образом, вам может сойти с рук простая рекурсия с некоторым OpenCL реализации, но для максимальной переносимости между различными платформами я бы настоятельно рекомендовал вам избегать этого.
Comments