2012-07-01 4 views
0

Мне нужно обработать некоторые данные в течение длительного времени в OpenCL, и из-за ограничения по времени (драйвер автоматически перезагружается) я запускаю ядро ​​много раз с разными параметрами. Каждый раз, когда он должен обрабатывать одни и те же данные, что составляет около 50 Мб, поэтому я хочу скопировать его только один раз. Я прочитал много статей и руководств об OpenCL, но понятия не имею, как это сделать, чтобы сохранить данные между выполнением.Сохранение данных в OpenCL

Если это важно, я использую привязку C# для OpenCL под названием OpenCLTemplate.

+0

Является ли ~ 50 МБ всегда доступным только для чтения? Это также похоже на то, что вы работаете на Windows O/S, который каждые несколько минут сбрасывает драйвер OpenCL, и ваши данные теряют данные на графическом процессоре. –

ответ

2

Любые данные, хранящиеся в буфере глобальной памяти, сохраняются на графическом процессоре. Вам не нужно ничего особенного делать.

-1

Как я понял из чтения онлайн, только одно ядро ​​может работать одновременно. Это означает, что вы должны иметь возможность запустить его с помощью одного набора параметров, когда можно будет запустить новый набор параметров, а затем во время этого запуска вы сможете прочитать 50 МБ.

Если драйвер перезагрузился - это может быть связано с ошибкой/исключением?

+1

Драйвер перезапускается из-за ограничения по времени: если ядро ​​работает в течение длительного времени, Windows отключает его. – aplavin

+0

Одновременные ядра не связаны с этим; вы можете на самом деле иметь разные ядра, работающие одновременно на некоторых графических процессорах; данные, которые вы предлагаете, являются противоположными тому, о чем идет речь. –

0

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

Что заставляет вас думать, что вам нужно писать в тот же буфер, из которого вы читаете?

+0

Теперь я запускаю функцию ядра со всеми данными в качестве аргумента и в качестве другого аргумента, к которому функция записывает результирующие данные. Я не знаю, как перстистировать данные между выполнением моего ядра, могут ли буферы помочь мне в этом случае? Что бы вы посоветовали прочитать об этом, особенно с примерами? – aplavin

+1

Вы спрашиваете: «Что такое openCL?» Создание и управление буфером составляет более 50% битвы с OpenCL. Понимание фундаментальной структуры данных для связи между хостом и устройством является предпосылкой для использования этой технологии. PyOpenCL - это то, что я изучал OpenCL. http://mathema.tician.de/software/pyopencl/ –

0

У вас есть несколько проблем;

1) Как получить 50MB данных на ГПУ 2) На окнах, драйвер GPU сбросит часто при выполнении длительных вычислений 3) механизм персистенции для ~ 50Mb

Возможных ответов 1a) создать буфер памяти OpenCL 50м 1b) Enqueue (записи) данных в ГПУ 1c) Установка ядра ARG в этот буфер 1d) доступ к данным в качестве арг ядра в глобальной памяти ГПУ

2) Когда драйвер драйвера OpenCL (графика) сбрасывается, ваше приложение умрет. Вы можете написать сценарий, который убивает его до того, как система выполнит, а затем перезапустит приложение. Сценарий должен прочитать промежуточный результат, прежде чем он убьет приложение. В противном случае вы никогда не будете контролировать. Только работа с графическим процессором Nvida Tesla в Windows или запуском на Linux позволит избежать того, что дисплей мышью O/S не работает и выполняет сброс драйвера.

3) Я бы использовал файлы MMAPed для сохранения 50 МБ данных и любых промежуточных результатов. Адресный файл MMAPed можно использовать для создания буферов OpenCL для приложения.

И наконец, я постараюсь под сомнение. Работает на Windows vs Linux, из-за проблем с перезагрузкой драйверов и т. Д. Я не мог найти эффективного решения для решения тайм-аута драйвера в Windows, даже используя базу данных PostgreSQL и собственный PgOpenCL, который гарантирует, что все ядра ядра GPU являются ACID.

+0

Это не проблема для моей цели, что ядро ​​может работать одновременно только около 0,5 секунд (например, я не измерил точное ограничение по времени). Мне нужен способ сохранить данные (которые доступны только для чтения) между запусками ядра. Теперь я понял, что нужен «глобальный буфер», и начал пытаться создавать и использовать его с привязкой к C# или python («потому что мне действительно не нравится C и пишут всю программу на этом языке»). – aplavin

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