О банк конфликтах Shared mry(CUDA)

Обсуждение статей и других материалов, опубликованных на этом сайте

Moderator: BarsMonster

Post Reply
User avatar
milan88
Posts: 6
Joined: Tue Oct 27, 2009 9:41 pm

О банк конфликтах Shared mry(CUDA)

Post by milan88 » Tue Oct 27, 2009 10:00 pm

http://habrahabr.ru/blogs/CUDA/50241/
Здравствуйте Михаил.
Почитал статью, очень интересный язык изложения) наверное наиболее понятный мне.

Вы пишите: Shared memory разделена на банки, и когда 2 потока одновременно пытаются обратиться к одному банку, возникает bank conflict и падает скорость.

Что такое банк конфликт, почему падает скорость? И как реагирует shred memory когда одновременно к ней обращаются много переменных в одну и ту же ячейку, например чтобы записать в нее свои значения, как она поведет себя? Как можно отконтролировать?
И что за функция такая EVENT? Она ведь тоже может использоваться в синхронизации потоков, но я не понимаю как. Как барьер? или как что? Если знаете объясните пожалуйста.
спасибо
Любите!!!Жертвенно

User avatar
BarsMonster
Site Admin
Posts: 1118
Joined: Wed Oct 01, 2008 7:58 pm

Re: О банк конфликтах Shared mry(CUDA)

Post by BarsMonster » Wed Oct 28, 2009 12:11 am

milan88 wrote:http://habrahabr.ru/blogs/CUDA/50241/
Здравствуйте Михаил.
Почитал статью, очень интересный язык изложения) наверное наиболее понятный мне.

Вы пишите: Shared memory разделена на банки, и когда 2 потока одновременно пытаются обратиться к одному банку, возникает bank conflict и падает скорость.

Что такое банк конфликт, почему падает скорость? И как реагирует shred memory когда одновременно к ней обращаются много переменных в одну и ту же ячейку, например чтобы записать в нее свои значения, как она поведет себя? Как можно отконтролировать?
И что за функция такая EVENT? Она ведь тоже может использоваться в синхронизации потоков, но я не понимаю как. Как барьер? или как что? Если знаете объясните пожалуйста.
спасибо
Скорость падает потому что ко всему банку может в одно время осуществлятся только одна операция записи/чтения. Если 5 потоков лезут одновременно - то придется ждать своей очереди.

Если запись в одну ячейку - то результат не предсказуем, читайте про атомарные операции.

Event-ы - это на стороне процессора, чтобы можно было отслеживать когда копирование данных/выполнение ядра завершилось.

User avatar
milan88
Posts: 6
Joined: Tue Oct 27, 2009 9:41 pm

Re: О банк конфликтах Shared mry(CUDA)

Post by milan88 » Wed Oct 28, 2009 11:46 am

Скорость падает потому что ко всему банку может в одно время осуществлятся только одна операция записи/чтения. Если 5 потоков лезут одновременно - то придется ждать своей очереди.
Легче опишу через задачу, потомучто мне не понятно, как будет построена очередь если все они потоки довольно равноправны между собой на первое место в очереди и обращаются одновременно.
Мне нужно понять архитектуру решения в куде.
Вот как это на задаче:
A=3
B=4
C=A+B
C=C+D[idxthread]
if C>9 other R=5 else R=3

Вот, суть в том, что допустим подключаем 4 потока и они начинают делать следующее:
На 1 шаге загружают в себя А
2. Загружают B
3.Суммируют их.
4. Еще раз находят новое С, где D это собственный номер потока, число от одного до четырех.
Затем они сравнивают свое С с девяткой, и у двух оно будет больше, а у двух будет меньше. Значит первые два будут стремиться записать в R значение 5, а вторые 3, причем одновременно. Как поведет себя ячейка отвечающая за R? Наверняка CUDA имеет какие-то решения, и не предсказуемость просто не знание от чего зависит поведение...

А насчет EVENTов, если они на стороне процессора(ЦПУ да?), то ими при запуске и отслежкой занимается ядро? так?
Ядро имеет доступ только в глобальной памяти сетки, и если каждый раз будет ядро сканировать глобалку, которая иатк напряжена то упадет производительность. shared memory тут не попользуешься, т.к. ядро ее не считывает, и только потоки с ней взаимодействуют записывают и читают ее просто как аналог более быстрой памяти глобальной?
ПРавильно я структуру понимаю?
Простите за большие посты, и за потраенное время.
спасибо
Last edited by milan88 on Wed Oct 28, 2009 11:53 am, edited 1 time in total.
Любите!!!Жертвенно

User avatar
BarsMonster
Site Admin
Posts: 1118
Joined: Wed Oct 01, 2008 7:58 pm

Re: О банк конфликтах Shared mry(CUDA)

Post by BarsMonster » Wed Oct 28, 2009 11:52 am

milan88 wrote:
Скорость падает потому что ко всему банку может в одно время осуществлятся только одна операция записи/чтения. Если 5 потоков лезут одновременно - то придется ждать своей очереди.
Легче опишу через задачу, потомучто мне не понятно, как будет построена очередь если все они потоки довольно равноправны между собой на первое место в очереди и обращаются одновременно.
Мне нужно понять архитектуру решения в куде.
Вот как это на задаче:
A=3
B=4
C=A+B
C=C+D[idxthread]
if C>9 other R=5 else R=3

Вот, суть в том, что допустим подключаем 4 потока и они начинают делать следующее:
На 1 шаге загружают в себя А
2. Загружают B
3.Суммируют их.
4. Еще раз находят новое С, где D это собственный номер потока, число от одного до четырех.
Затем они сравнивают свое С с девяткой, и у двух оно будет больше, а у двух будет меньше. Значит первые два будут стремиться записать в R значение 5, а вторые 3, причем одновременно. Как поведет себя ячейка отвечающая за R? Наверняка CUDA имеет какие-то решения, и не предсказуемость просто не знание от чего зависит поведение...
Такая задача - не то, на что расчитаны на вычисления на видеокартах, и решений нет. Результат непредсказуем.
В CUDA нужно решать задачи, где разные потоки по возможности друг с другом никак не соприкосаются.
А насчет EVENTов, если они на стороне процессора, то ими при запуске и отслежкой занимается ядро? так?
Да
Ядро имеет доступ только в глобальной памяти сетки, и если каждый раз будет ядро сканировать глобалку, которая иатк напряжена то упадет производительность. shared memory тут не попользуешься, т.к. ядро ее не считывает, и только потоки с ней взаимодействуют записывают и читают ее просто как аналог более быстрой памяти глобальной?
ПРавильно я структуру понимаю?
Простите за большие посты, и за потраенное время.
спасибо
Ядро центрального процессора вообще никуда доступа на прямую не имеет. Но можно скопировать кусочек глобальной памяти по запросу.

User avatar
milan88
Posts: 6
Joined: Tue Oct 27, 2009 9:41 pm

Re: О банк конфликтах Shared mry(CUDA)

Post by milan88 » Wed Oct 28, 2009 3:00 pm

Такая задача - не то, на что расчитаны на вычисления на видеокартах, и решений нет. Результат непредсказуем.
В CUDA нужно решать задачи, где разные потоки по возможности друг с другом никак не соприкосаются.
Не соприкасаются это значит, не расчитывают одну и ту же переменную, которая будет перезаписана? Неправильный параллелизм из-за ошибки програмиста? (p.s. интересно как можно повычислять число Пи, и обогннатть Токийский университет))) :)
ПОток может же обмениваться информации без участия памяти с другим потоком(сосденим например)??? перекинуть в нее переменную, котороую толькочто высчитал, чтобы следующий считал, то что должен считать?
Ядро центрального процессора вообще никуда доступа на прямую не имеет. Но можно скопировать кусочек глобальной памяти по запросу.
\
Я для себя уяснил, что задача разбивается на подзадачи ядром. И он вносит в глобалку данные и переменные, после чего их распределяют на себе потоки, и что указано в коде, то перекидывают в общую память и уже занимаются вычислениями, правильно понимаю?

p.s. чего-то аватаки не ставятся 90на90
Любите!!!Жертвенно

User avatar
BarsMonster
Site Admin
Posts: 1118
Joined: Wed Oct 01, 2008 7:58 pm

Re: О банк конфликтах Shared mry(CUDA)

Post by BarsMonster » Wed Oct 28, 2009 4:13 pm

milan88 wrote:
Такая задача - не то, на что расчитаны на вычисления на видеокартах, и решений нет. Результат непредсказуем.
В CUDA нужно решать задачи, где разные потоки по возможности друг с другом никак не соприкосаются.
Не соприкасаются это значит, не расчитывают одну и ту же переменную, которая будет перезаписана? Неправильный параллелизм из-за ошибки програмиста? (p.s. интересно как можно повычислять число Пи, и обогннатть Токийский университет))) :)
ПОток может же обмениваться информации без участия памяти с другим потоком(сосденим например)??? перекинуть в нее переменную, котороую толькочто высчитал, чтобы следующий считал, то что должен считать?
Формально да. С соседним, через shared memory + __synchthreads() который подождет пока все потоки дойдут до этого места на текущем мультипроцессоре (не на всем GPU).
Ядро центрального процессора вообще никуда доступа на прямую не имеет. Но можно скопировать кусочек глобальной памяти по запросу.
\
Я для себя уяснил, что задача разбивается на подзадачи ядром. И он вносит в глобалку данные и переменные, после чего их распределяют на себе потоки, и что указано в коде, то перекидывают в общую память и уже занимаются вычислениями, правильно понимаю?

p.s. чего-то аватаки не ставятся 90на90
Да, правильно.
А размер не больше 19кб?

User avatar
milan88
Posts: 6
Joined: Tue Oct 27, 2009 9:41 pm

Re: О банк конфликтах Shared mry(CUDA)

Post by milan88 » Wed Oct 28, 2009 7:10 pm

Формально да. С соседним, через shared memory + __synchthreads() который подождет пока все потоки дойдут до этого места на текущем мультипроцессоре (не на всем GPU).
т.е. обмен данными между двумя потоками происходит не в момент времени когда потребуется одному потоку это, а в момент времени когда все потоки дойдут до барьера синхронизации - остановятся, скажут Я ДОШЕЛ ДО БАРЬЕРА! И тогда в эту короткую паузу перед началом нового цикла, происходит считка данных? Но тогда такой вопрос, если мы ставим потоку задачу вычислять 100 раз одно и то же число, а второму 200 раз свою операцию. А остальные 100 раз первый поток будет заимствовать переменную из второго потока, то тормоза сильные будут? не знай? И как связываются Общая память и Глобальная между собой? Потоками? Потоки имеют какой-то контролер? Ведь ядро из ЦПУ контролирует только глобальную память???
А еще фукнция __synchthreads() каким образом обозначает барьер, при котором потоки встают и ждут другие?

p.s. картинка 5кб весит
Любите!!!Жертвенно

User avatar
BarsMonster
Site Admin
Posts: 1118
Joined: Wed Oct 01, 2008 7:58 pm

Re: О банк конфликтах Shared mry(CUDA)

Post by BarsMonster » Wed Oct 28, 2009 8:04 pm

milan88 wrote:
Формально да. С соседним, через shared memory + __synchthreads() который подождет пока все потоки дойдут до этого места на текущем мультипроцессоре (не на всем GPU).
т.е. обмен данными между двумя потоками происходит не в момент времени когда потребуется одному потоку это, а в момент времени когда все потоки дойдут до барьера синхронизации - остановятся, скажут Я ДОШЕЛ ДО БАРЬЕРА! И тогда в эту короткую паузу перед началом нового цикла, происходит считка данных? Но тогда такой вопрос, если мы ставим потоку задачу вычислять 100 раз одно и то же число, а второму 200 раз свою операцию. А остальные 100 раз первый поток будет заимствовать переменную из второго потока, то тормоза сильные будут? не знай? И как связываются Общая память и Глобальная между собой? Потоками? Потоки имеют какой-то контролер? Ведь ядро из ЦПУ контролирует только глобальную память???
А еще фукнция __synchthreads() каким образом обозначает барьер, при котором потоки встают и ждут другие?

p.s. картинка 5кб весит
Обмен данными то когда угодно, но из-за того что на 1 мультипроцессоре запускается по 500 потоков, совершенно нельзя предсказать что будут делать в это время другие потоки.
Тормоза на синхронизированный обмен данными - большие.
Память компьютера и глобальная память видеокарты - только через cudaMemcpy, данные идут через PCI-E. Прямого доступа к одной конкретной ячейке - нет, только копировать целые переменные/массивы.
__syncthread() - пишешь её, и все потоки будут собираться в этой точке прежде чем идти дальше. Ни разу не использовал.

User avatar
BarsMonster
Site Admin
Posts: 1118
Joined: Wed Oct 01, 2008 7:58 pm

Re: О банк конфликтах Shared mry(CUDA)

Post by BarsMonster » Wed Oct 28, 2009 8:23 pm

аватар пробуем снова :crazy:

User avatar
milan88
Posts: 6
Joined: Tue Oct 27, 2009 9:41 pm

Re: О банк конфликтах Shared mry(CUDA)

Post by milan88 » Thu Oct 29, 2009 9:18 am

BarsMonster wrote: Память компьютера и глобальная память видеокарты - только через cudaMemcpy, данные идут через PCI-E. Прямого доступа к одной конкретной ячейке - нет, только копировать целые переменные/массивы.
Вот скопировали переменные/массивы в глобалку. Вопрос - как они из глобалки перейдут в общую память? С помощью кого? Если ядро их туда не может отправить, т.к. не контролирует общую память, а сама по себе глобалка является только хранилищем инфы. Кто скажет переменной "Иди в общую память, твое место там"?


И еще допустим поток будет считать дробь 4/7 это равное 0,57142857142857142857142857142857.. и так можно сколько угодно...как мне сказать потоку, чтобы он делил допустим до 200 знаков после запятой???и ответ вносил в память? может с помощью EVENT можно это сделать?
p.s.аватарки заробили
Любите!!!Жертвенно

User avatar
BarsMonster
Site Admin
Posts: 1118
Joined: Wed Oct 01, 2008 7:58 pm

Re: О банк конфликтах Shared mry(CUDA)

Post by BarsMonster » Thu Oct 29, 2009 7:33 pm

milan88 wrote:
BarsMonster wrote: Память компьютера и глобальная память видеокарты - только через cudaMemcpy, данные идут через PCI-E. Прямого доступа к одной конкретной ячейке - нет, только копировать целые переменные/массивы.
Вот скопировали переменные/массивы в глобалку. Вопрос - как они из глобалки перейдут в общую память? С помощью кого? Если ядро их туда не может отправить, т.к. не контролирует общую память, а сама по себе глобалка является только хранилищем инфы. Кто скажет переменной "Иди в общую память, твое место там"?


И еще допустим поток будет считать дробь 4/7 это равное 0,57142857142857142857142857142857.. и так можно сколько угодно...как мне сказать потоку, чтобы он делил допустим до 200 знаков после запятой???и ответ вносил в память? может с помощью EVENT можно это сделать?
p.s.аватарки заробили
Данные и в память видеокарты, и обратно копируются с помощью cudaMemcpy.
Это можно делать только когда все расчеты закончены.

Чтобы было 200 знаков - то что-то типа for(int i=0;i<200;i++) {тут считаем цифру};
Извне поток остановить невозможно.

User avatar
milan88
Posts: 6
Joined: Tue Oct 27, 2009 9:41 pm

Re: О банк конфликтах Shared mry(CUDA)

Post by milan88 » Sat Oct 31, 2009 10:58 am

BarsMonster wrote: Event-ы - это на стороне процессора, чтобы можно было отслеживать когда копирование данных/выполнение ядра завершилось.
В CUDA они только нужны для сигнализации копировании данных и расчета времени между сигналами(eventrecord)??? я просто нигде не найду по ним ничего нормального. На примерах видел, что только применяются в перед коппированием cudaevent(start) и сразу после cudaevent(stop) Ведь в языках эвенты имеют и другие функции, являются более обширным в употреблении интстументом.
Любите!!!Жертвенно

User avatar
BarsMonster
Site Admin
Posts: 1118
Joined: Wed Oct 01, 2008 7:58 pm

Re: О банк конфликтах Shared mry(CUDA)

Post by BarsMonster » Sat Oct 31, 2009 3:38 pm

milan88 wrote:
BarsMonster wrote: Event-ы - это на стороне процессора, чтобы можно было отслеживать когда копирование данных/выполнение ядра завершилось.
В CUDA они только нужны для сигнализации копировании данных и расчета времени между сигналами(eventrecord)??? я просто нигде не найду по ним ничего нормального. На примерах видел, что только применяются в перед коппированием cudaevent(start) и сразу после cudaevent(stop) Ведь в языках эвенты имеют и другие функции, являются более обширным в употреблении интстументом.
В данном случае - только для этого, чтобы можно было уйти в Sleep() чтобы другие потоки на центральном процессоре получили пару миллисекунд работы.

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest