2013-10-04 2 views
0

У меня есть ядро, где я использую некоторую общую память. Я копирую автомат в общую память, выполняю несколько шаблонов, получаю некоторые результаты и выхожу.Возможно ли продлить жизнь общей памяти?

После того, как я покинул это ядро, я вызываю это же ядро ​​и копирую один и тот же автомат в разделяемую память, но теперь данные, которые будут проверены на соответствие шаблонов, являются другими.

Я хочу знать, могу ли я разрешить эти данные (автомат) в общей памяти, поэтому моя программа будет быстрее, копируя автомат в общую память только в первый раз.

Я думал, существует ли какая-либо функция синхронизации, которая может быть вызвана с устройства, чтобы сообщить хосту, что ядро ​​закончено, поэтому я могу запустить ядро ​​с самого начала без очистки общей памяти.

Любая идея? Благодарю.

ответ

3

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

+0

Знаете ли вы, существует ли какая-либо функция синхронизации, которая может синхронизировать хост с ядром? – Blufter

+0

@Blufter 'cudaDeviceSynchronize()'. Помните, что 'cudaMemcpy' блокирует хост и, таким образом, создает синхронизацию между хостом и устройством. – JackOLantern

+0

Спасибо за совет. – Blufter

3

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