2013-05-25 2 views
1

Итак, у меня есть этот метод, который требует применения большого количества преобразований на изображении. В целом мне нужно несколько разных операций, применяемых к тем же данным. В моем коде процессора я делаю все эти преобразования в одном цикле, но мне было интересно, как наилучшим образом применить его в cuda.Лучший способ обработки большого алгоритма на Cuda

Таким образом, в CPU У меня есть

loop 1 
    loop 2 
    loop 3 
     DO A LOT OF SMALL BUT INDEPENDENT OPERATIONS 
    end 
    end 
end 

Я использую резьбу на внешней петле с OpenMP и алгоритм ускоряется почти раз число потоков, поэтому очень paralelizable. Тем не менее, для очень больших изображений это может занять много времени, поэтому я решил, что могу использовать Cuda.

Так мне удалось избавиться от внешних петель: петля 1 и петля 2 и заменить каждый такт с один Cuda поток, но теперь я не уверен, что это лучший дизайн

Например, я пытался делать это

cuda_kernel{ 

    loop 3 
     DO A LOT OF SMALL BUT INDEPENDENT OPERATIONS 
    end 
} 

Некоторые из этих операций имеют ветвление, а другие нет. Мой вопрос, если вы думаете, что лучше всего на Cuda, чтобы сделать это вместо

cuda_kernel 1{ 

    loop 3 
     DO JUST FIRST OPERATION 
    end 
} 

cuda_kernel 2{ 

    loop 3 
     DO JUST SECOND OPERATION 
    end 
} 


ETC 

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

Итак, что бы вы посоветовали рассчитать все сразу или сделать каждое ядро ​​отдельно?

ответ

1

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

cuda_kernel { 
loop 2 
    loop 3 
    Do stuff here ... 
    end 
end 
} 

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

+1

«Ядро вызова очень дорогостоящее с точки зрения времени выполнения»? На платформах, которые я использую, это около 10-15 микросекунд. – talonmies

+0

Человек, 10-15 микросекунд все еще огромный (хотя я уверен в этом числе). Если вы думаете о тактовых частотах ядра 800 МГц, то 10us походит на 8000 тактов. Это много. Особенно, если ваше выполнение ядра занимает не так много времени, вы будете доминировать в вызовах ядра, чего не должно быть. – Bichoy

+0

На самом деле ядра будут вызываться только один раз, поэтому я не слишком беспокоюсь об этом, будет 32 разных ядра, я могу полностью избавиться от цикла 2. Но цикл 3 в ядрах будет выполняться много раз, а не один раз, если я использую большое ядро. Поэтому мой вопрос, который, по вашему мнению, будет более эффективным. – Atirag

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