【问题标题】:Vectorize this, filter string arrays by a string? GPU pipeline?向量化这个,用字符串过滤字符串数组? GPU管道?
【发布时间】:2015-07-14 03:29:30
【问题描述】:

我确实搜索过,但没有找到使用 MPICH 或矢量化之类的东西。在fortran中,我会使用MPICH来分解代码以使其瘫痪。

这是在配备 Metal 的 iPad 上运行。

我有一个包含数十万个元素的一维字符串数组,其中很多是重复的。我想找到重复的索引。

到目前为止,我正在使用简单的循环,但它很慢,所以我正在寻找一种方法来矢量化它或尽可能分而治之?或者也许有办法在 Metal 中使用管道?

  class func filterDatabyString(dataString:[String],filterString:String) -> [Int]
  {
    var arrayIndex:[Int] = []
    var i:Int = 0

    for (i = 0; i < dataString.count; i++) {
      if dataString[i] == filterString
      {
        arrayIndex.append(i)
      }
    }

    return (arrayIndex)
  }

【问题讨论】:

  • 那么为什么要查找重复项的索引?另外,不是所有的重复项都一样吗?那么为什么需要将它们全部放入数组中呢?
  • 把它们放在散列中。如果存在,则为重复项。
  • 你对我的问题投了反对票吗?不,还有其他数组有依赖关系,所以我需要索引。
  • 放入散列似乎会增加更多开销。当我已经有数组时,为什么要转换为/从哈希?我还需要索引,哈希是无序的。
  • 一般你使用Hash来获得O(1)搜索。查看您当前的代码,您应该得到整体代码的 O(n^2) 而不是 O(n),再多的并行化也无助于克服这一点。

标签: ios arrays swift search vectorization


【解决方案1】:
filter(enumerate(dataString)) { $0.1 == filterString }.map { $0.0 }

如果你只需要索引,那么这个例子就足够了。我不确定这是否会更快。有点好奇。

【讨论】:

  • 因为你只需要索引,所以我改变了我的答案。我想知道 map 与 for-loop 或 Ben Kane 的例子相比有多快。
  • 好的,给我一点时间,我不确定地图有多少开销。我在 perl 中使用 map,但 perl 针对这些操作进行了优化。这张地图不返回布尔值吗?
  • 我已经测试了一下。本的例子是迄今为止最快的。糟糕,看来我复制粘贴了错误的代码!
  • Ben 的代码比地图快多少个数量级?我现在要试试那个 OpenCL 代码。
  • 好吧,使用 filter/map 看起来会更好。它无法击败 Ben 的代码,这是同时发生的。在我对 10.000 个对象的测试中,Ben 的代码在 3 秒和 2.51 秒内完成,而使用过滤器/映射则需要 7.72 秒。
【解决方案2】:

您可以将dataString 数组设为NSArray 并同时枚举。这样的事情怎么样?

func filterDataByString(dataString:[String], filterString:String) -> [Int]
{
    var arrayIndex = [Int]()
    let data = dataString as NSArray
    data.enumerateObjectsWithOptions(.Concurrent) { (string: AnyObject!, index: Int, stop:UnsafeMutablePointer<ObjCBool>) -> Void in
        if(string as! String == filterString)
        {
            arrayIndex.append(index)
        }
    };

    return arrayIndex
}

【讨论】:

  • 谢谢,我也会对此进行基准测试。你知道有什么方法可以利用 GPU 来管道吗?
  • 您可能想查看Using GCD with OpenCL。不过,不要认为它在 iOS 上可用。至少不公开。
  • Here's an article 关于使用 OpenGL 和 GitHub repo 来配合它。
  • 酷,谢谢。我将编写一些 OpenCL/Metal 代码并生成一个基准测试......只要这个问题没有被投票给遗忘。如果是的话,我会PM你的时间。
  • 平均运行 20 次后,使用 enumerateObjectsWithOptions(.Concurrent) 比简单循环快约 1.5 倍。
猜你喜欢
  • 2018-09-28
  • 1970-01-01
  • 2021-06-06
  • 2022-07-04
  • 2019-05-02
  • 1970-01-01
  • 2019-04-04
  • 2017-07-15
  • 2011-05-15
相关资源
最近更新 更多