Если мы говорим только о графических процессорах, ответ - очень легкий.
Имеет ли смысл отправлять по существу 1 миллион задач в графический процессор
Вы не «отправляете миллион задач» в графический процессор.Вы отправляете один запрос длиной в несколько десятков байт, который, по сути, говорит: «Пожалуйста, запустите миллион копий этого кода с координатами сетки, которые я вам здесь предоставлю».Эти «копии» создаются на лету аппаратными средствами внутри графического процессора, и да, это очень эффективно.
1000 задач, и каждое выполнение ядра проходит через 1000 членов массива
На GPU вы почти наверняка не хотите этого делать.Современный высокопроизводительный GPU имеет более 4000+ процессорных блоков, поэтому вам нужно при минимальном таком количестве параллелизма.Но обычно намного выше.Существует планировщик, который выбирает один аппаратный поток для запуска на каждом из этих блоков обработки, и обычно на каждый блок обработки приходится несколько десятков аппаратных потоков.Так что нет ничего необычного в том, чтобы увидеть GPU с аппаратными потоками 100K +.Это необходимо для того, чтобы скрыть задержки памяти.
Так что, если вы запустите ядро с размером сетки 1000x1, 3/4 вашего GPU может быть неиспользованным, а использованная часть будет тратить 90% времени на ожидание памяти,Идите и попробуйте.Графический процессор был разработан для обработки смешного количества потоков - не бойтесь их использовать.
Теперь, если вы говорите о процессоре, это немного другой вопрос.Процессоры, очевидно, не имеют 1000 аппаратных потоков.Здесь это зависит от реализации OpenCL - но я думаю, что наиболее разумные реализации OpenCL для ЦП сегодня справятся с этим, обрабатывая работу в циклах, в достаточном количестве аппаратных потоков для вашего ЦП.
TL; DR: useрешение "1 миллион задач", и, возможно, попробуйте настроить локальный размер работы.