Кто-нибудь пробовал функции gpu_sync, описанные в статье «Межблочная передача графического процессора через Fast Barrier Synchronization»? Все описанные коды кажутся довольно простыми и легкими в реализации, но он продолжает замерзать мой графический процессор. Я уверен, что я делаю что-то глупое, но я не понимаю, что. Может кто-нибудь мне помочь?Глобальная синхронизация OpenCL и GPU
Стратегии Я использую это один описан в разделе «GPU безблокировочной синхронизации» и вот исходный код OpenCL я реализовал:
static void globalSync(uint iGoalValue,
volatile __global int *globalSyncFlagsIN,
volatile __global int *globalSyncFlagsOUT)
{
const size_t iLocalThreadID = get_local_id(0);
const size_t iWorkGroupID = get_group_id(0);
const size_t iWorkGroupCount = get_num_groups(0);
//Only the first thread on each SM is used for synchronization
if (iLocalThreadID == 0)
{ globalSyncFlagsIN[iWorkGroupID] = iGoalValue; }
if (iWorkGroupID == 0)
{
if (iLocalThreadID < iWorkGroupCount)
{
while (globalSyncFlagsIN[iLocalThreadID] != iGoalValue) {
// Nothing to do here
}
}
barrier(CLK_GLOBAL_MEM_FENCE);
if (iLocalThreadID < iWorkGroupCount)
{ globalSyncFlagsOUT[iLocalThreadID] = iGoalValue; }
}
if (iLocalThreadID == 0)
{
while (globalSyncFlagsOUT[iWorkGroupID] != iGoalValue) {
// Nothing to do here
}
}
barrier(CLK_GLOBAL_MEM_FENCE);
}
Спасибо заранее.
Просто подумал о моем последнем предложении. Разумеется, Arrayin и Arrayout должны быть в памяти __global, чтобы потоки из разных блоков могли обмениваться данными через него. Забор памяти должен быть локальным, так как синхронизируются только потоки из группы 1. Я отредактировал ответ. –
Кроме того, убедитесь, что длины массивов по меньшей мере равны количеству блоков. –
Привет, Сергей, спасибо за ваш быстрый ответ. – Walid