2016-05-14 7 views
0

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

мне нужно сделать что-то вроде этого:

__device__ configType dev_bestConfig = 0; 
__device__ int dev_bestValue = INT_MAX; 

__device__ void findMinimalDominantSet(int count, const int *matrix, Lock &lock) 
{ 
    // here is some algorithm that finds local bestValue and bestConfig 

    // set device variables 
    if (bestValue < dev_bestValue) 
    { 
     dev_bestValue = bestValue; 
     dev_bestConfig = bestConfig; 
    } 
} 

Я знаю, что это не работает, потому что больше потоков обращается к памяти, в то же время, поэтому я использую этот критический раздел:

// set device variables 
    bool isSet = false; 
    do 
    { 
     if (isSet = atomicCAS(lock.mutex, 0, 1) == 0) 
     { 
      // critical section goes here 
      if (bestValue < dev_bestValue) 
      { 
       dev_bestValue = bestValue; 
       dev_bestConfig = bestConfig; 
      } 
     } 
     if (isSet) 
     { 
      *lock.mutex = 0; 
     } 
    } while (!isSet); 

Это действительно работает так, как ожидалось, но это очень медленно. Например, без этого критического раздела он занимает 0,1 сек. И с этой критической секцией требуется 1,8 секунды.

Что я могу сделать, чтобы сделать это быстрее?

+2

Используйте стандартную параллельную редукцию. Параллельное сокращение найдет минимальное 'bestValue', а также идентификатор потока, который его создал. По завершении сокращения вы можете просто захватить 'bestConfig', используя этот идентификатор. Или вы можете просто выполнить параллельное сокращение непосредственно на 'bestValue' и' bestConfig'. Основное учебное пособие по параллельной редукции [здесь] (https://docs.nvidia.com/cuda/samples/6_Advanced/reduction/doc/reduction.pdf). –

+0

Не могли бы вы предоставить более подробную информацию о своей проблеме? Не могли бы вы предоставить исполняемый код, чтобы продемонстрировать, что он недостаточно быстрый. Вы пытаетесь найти минимум массива? Параллельное восстановление может это сделать. – kangshiyin

+0

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

ответ

1

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

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