Iphone 目标C:从多个线程调用和复制同一块

Iphone 目标C:从多个线程调用和复制同一块,iphone,objective-c,neural-network,objective-c-blocks,objective-c-runtime,Iphone,Objective C,Neural Network,Objective C Blocks,Objective C Runtime,我在这里讨论的是神经网络,但可以忽略这一点,因为真正的问题是处理objective-c中的块。这是我的问题。我找到了一种方法,将神经网络转换成一个大的块,可以一次执行。然而,相对于激活网络,它的速度非常非常慢。这似乎有点违反直觉 如果我给你一组嵌套函数,比如 CGFloat answer = sin(cos(gaussian(1.5*x + 2.5*y)) + (.3*d + bias)) //or in block notation ^(CGFloat x, CGFloat y, CGFloa

我在这里讨论的是神经网络,但可以忽略这一点,因为真正的问题是处理objective-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));
};
从理论上讲,多次运行该函数应该比在一堆连接中循环、设置节点为活动/非活动等更容易/更快,所有这些最终基本上都会计算相同的函数

但是,当我创建一个块(请参阅thread:)并运行此代码时,对于任何中等规模的网络来说,速度都非常慢

现在,我不太明白的是:

  • 复制块时,您到底在复制什么
  • 比方说,我复制一个块两次,copy1和copy2。如果在同一线程上调用copy1和copy2,是否调用了相同的函数?我不太明白这些文件对于正版拷贝的确切含义:
  • 现在,如果我再次创建副本,copy1和copy2,但是相反,我在不同的线程上调用副本,那么函数的行为如何?当每个线程试图访问同一个块时,这会导致某种程度的减速吗
  • 复制块时,具体是什么 你在抄吗

    您正在复制块捕获的任何状态。如果该块未捕获任何状态(该块似乎未捕获),则副本应为“空闲”,因为该块将是一个常量(类似于@“”的工作方式)

    比方说,我复制一个块两次,复制1 和copy2。如果我叫copy1和copy2 在同一个线程上,是相同的 调用的函数?我不明白 文档对block的确切含义是什么 副本:Apple Block Docs

    复制块时,永远不会复制块的代码。只有被占领的国家。因此,是的,您将执行完全相同的指令集

    现在如果我再复制一次,复制1 和copy2,但是我把 在不同的线程上复制,现在怎么办 函数的行为?这会导致 某种程度上的减速,因为每个线程 是否尝试访问同一块

    在一个块中捕获的数据不受多线程访问的保护,因此不会有任何减速(但会有您可能想象的所有并发同步乐趣)

    您是否尝试过对应用程序进行采样以查看消耗CPU周期的内容?另外,考虑到您将要做的事情,您可能希望熟悉您友好的本地反汇编程序(
    otool-TtVv binary/or/.o/file
    ),因为它可以非常有助于确定块拷贝的实际成本


    如果您正在采样,并且在块本身中看到了大量的时间,那么这只是您的计算消耗了大量的CPU时间。如果块在复制期间消耗CPU,您将在复制助手中看到消耗

    尝试创建一个包含大量不同类型块的源文件;带参数、不带、带捕获状态、不带、带捕获块、带/不带捕获状态等。。以及一个函数,该函数对每个对象调用Block_copy()


    将其分解,您将深入了解复制块时会发生什么。就我个人而言,我发现x86_64汇编比ARM更易于阅读。(这听起来像是很好的博客素材——我应该写出来)。

    复制不是我担心的,因为我每个神经网络只做几次,这是块的运行。当我查看cpu时间的细分时,它有一些特定的块名,占用了很多时间。所以就像“乙状结肠”阻塞占用了10%的时间。我想我不知道当你复制一个引用另一个块的块时会发生什么?