У меня есть 3 вложенных цикла, самый верхний и самый внутренний циклы являются поточно-ориентированными, но средний цикл — нет. По сути, я работаю с нелинейной функцией в каждом столбце большой матрицы несколько раз. Мне нужно перебрать столбцы, затем итерации функции, затем строки.
Я использую MacPro с Xcode, Grand Central Dispatch и openCL. У меня есть несколько вариантов, как это сделать. 1) Я могу использовать процессор, чтобы циклически проходить по столбцам, а другие 2 цикла выполнять только с помощью for. 2) я могу использовать openCL на моем графическом процессоре для параллельного циклического перемещения по строкам (делая другие с циклами for) или 3) если мне повезет, я могу использовать центральный процессор для параллельного выполнения верхнего цикла и openCL для выполнения самый внутренний цикл параллельно. Я попробовал третий вариант, потому что, если он сработает, он будет самым быстрым, надеюсь …
так я и сделал
dispatch_apply(ncol,cpu_queue,^(size_t col){ // outermost column loop
void* gpu_mem = gcl_malloc(...); // send column to GPU
dispatch_sync(gpu_queue,^{ // tells it to do stuff on GPU
for (int t = 0; t < nt; t++){ // loop over iterations of function
function_kernel(&range,...); // openCL loop over the rows
}
gcl_memcpy(...); // send results back to CPU
});
dispatch_release(gpu_queue); // release the queue
gcl_free(gpu_mem); // free the gpu memory
});
Этот код замораживает мой компьютер, мне приходится жестко выключать, удерживая кнопку питания на коробке. Я определил виновника … gcl_free (gpu_mem); … Если я это закомментирую, то код работает нормально. Но все это на самом деле внутри большего цикла. Таким образом, приведенный выше код работает для 2 или 3 итераций большого внешнего цикла, но затем у gpu заканчивается память, потому что я не освобождаю его. Если я изменю первый dispatch_apply на цикл for, все тоже будет работать нормально, и я смогу освободить память gpu без проблем.
Я думаю, что мой компьютер достаточно умен, чтобы эффективно выполнять цикл openCL внутри параллельного цикла диспетчеризации, потому что этот код (без gcl_free) значительно быстрее, чем использование цикла for для столбцов. Мой GPU имеет где-то около 2000 ядер, и я использую ~ 100 рабочих групп, поэтому я не думаю, что это бутылочное горлышко. Это просто проблема освобождения памяти графического процессора внутри параллельного цикла.
Какие-либо предложения?
Задача ещё не решена.