Objective-C: вызов и копирование одного и того же блока из нескольких потоков - PullRequest
0 голосов
/ 28 марта 2011

Я имею дело с нейронными сетями здесь, но это безопасно игнорировать, так как реальный вопрос должен иметь дело с блоками в target-c. Вот моя проблема. Я нашел способ преобразовать нейронную сеть в большой блок, который может быть выполнен сразу. Тем не менее, он идет очень медленно, по сравнению с активацией сети. Это кажется немного нелогичным.

Если бы я дал вам группу вложенных функций, таких как

CGFloat answer = sin(cos(gaussian(1.5*x + 2.5*y)) + (.3*d + bias))
//or in block notation
^(CGFloat x, CGFloat y, CGFloat d, CGFloat bias) {
 return sin(cos(gaussian(1.5*x + 2.5*y)) + (.3*d + bias));
};

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

Однако, когда я создаю блок (см. Нить: как создать функцию во время выполнения ) и запускаю этот код, он медлителен как ад для любой сети среднего размера.

Теперь я не совсем понимаю:

  1. Когда вы копируете блок, что именно вы копируете?
  2. Допустим, я дважды копирую блок, copy1 и copy2. Если я вызываю copy1 и copy2 в том же потоке , вызывается ли одна и та же функция? Я не совсем понимаю, что означают документы для блочных копий: Документы Apple Block
  3. Теперь, если я сделаю эту копию снова, copy1 и copy2, но вместо этого я вызову копии в отдельных потоках, как теперь будут вести себя функции? Приведет ли это к замедлению, поскольку каждый поток пытается получить доступ к одному и тому же блоку?

1 Ответ

1 голос
/ 28 марта 2011

Когда вы копируете блок, что именно вы копируете?

Вы копируете любое состояние, захваченное блоком.Если в этом блоке нет состояния, в котором этот блок, по-видимому, отсутствует, то копия должна быть «свободной», так как блок будет константой (аналогично тому, как работает @ »).

Допустим, я копирую блок дважды, copy1 и copy2.Если я вызываю copy1 и copy2 в одном потоке, вызывается ли одна и та же функция?Я не совсем понимаю, что значат документы для блочных копий: Apple Block Docs

Когда блок копируется, код блока никогда не копируется.Только захваченное государство.Итак, да, вы будете выполнять точно такой же набор инструкций.

Теперь, если я сделаю эту копию снова, copy1 и copy2, но вместо этого я вызову копии в отдельных потоках, теперь какфункции ведут себя?Приведет ли это к некоторому замедлению, поскольку каждый поток пытается получить доступ к одному и тому же блоку?

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

Пробовали ли вы пробовать приложение, чтобы посмотреть, что потребляет циклы ЦП?Кроме того, учитывая, куда вы идете с этим, вы, возможно, захотите познакомиться с вашим дружественным локальным дизассемблером (otool -TtVv binary/or/.o/file), так как он может быть весьма полезен для определения того, насколько дорогой является действительно блок-копия.

Если вы выполняете выборку и видите много времени в самом блоке, то это всего лишь ваши вычисления, потребляющие много процессорного времени.Если бы блок потреблял процессор во время копирования, вы бы увидели потребление в помощнике по копированию.

Попробуйте создать исходный файл, который содержит несколько блоков разных типов;с параметрами, без, с захваченным состоянием, без, с захваченными блоками с / без захваченного состояния и т. д. и функцией, которая вызывает Block_copy () для каждого.

Разберите это, и вы получите глубокое пониманиео том, что происходит, когда блоки копируются.Лично я считаю, что сборка x86_64 легче читать, чем ARM.(Все это звучит как хороший корм для блогов - я должен написать это).

...