Комментировать

Примерно так

Дело в том, что в выражении могут быть вызовы функций, описанных в этом же выражении (задача из области Genetic Programming, поэтому буду называть такие функции так, как их принято называть в этой области - Automatically Defined Functions или ADFs).

Пример такого выражения:
X X + 2 - ADF0 arg0 arg0 *

Это означает вот что: ADF0(X + X - 2), где ADF0 имеет один аргумент arg0 и возвращает его квадрат (arg0 * arg0). Таких функций в выражении может быть скажем до пяти, аргументов у каждой может быть скажем тоже до пяти, кроме того, ADF со старшим номером может вызывать ADF с младшим номером (ADF2(ADF1(ADF0(arg0)))) сколько угодно много. Обращать внимание на возможность наличия ADFs не надо - они не меняют задачу принципиально - но объясняют, почему на некоторых выражениях максимальная глубина стека может быть 60-70 элементов.

Я могу варьировать макс глубину стека перед запуском кернела, предварительно попробовав на зуб выражения на одном тест кейсе на CPU, далее, в зависимости от требуемой shared mem на поток (которая определяется максимальной возможной глубиной), потоков может быть от 32 до 160. Пытаюсь я запустить как можно больше потоков потому, что при 32 потоках в текущей имплементации всё работает существенно медленнее, чем при 160.

Моё мыло: babylon73@mail.ru. Если Вы бросите туда тестовое сообщение, то я могу отослать весь вычислительный код, он не сильно здоровый, но даст полную картину. Обсуждение же можно (и думаю нужно) продолжить тут - может быть полезным многим.