平行的strlen?

时间:2011-02-25 15:50:20

标签: c parallel-processing strlen

我想知道尝试编写strlen函数以并行查找\0序列是否有任何优点。如果是这样,这样的功能应该考虑什么?感谢。

6 个答案:

答案 0 :(得分:8)

strlen()按精神顺序 - 超出null终止符的一步是未定义的行为,并且null终止符可以是任何位置 - 第一个字符或第一百万个字符,因此您必须按顺序扫描。

答案 1 :(得分:4)

您必须确保线程找到的NUL是字符串中的第一个NUL,这意味着线程需要同步它们的最低NUL位置是。因此,虽然可以完成,但同步的开销远远超过并行化的任何潜在收益。

此外,还有缓存问题。单个线程可以连续读取字符串,这是缓存友好的。多个线程冒着踩到对方脚趾的风险。

答案 2 :(得分:1)

在一些并行体系结构上是可能的,但只有当一个人可以保证可以安全地访问大量字符串之外的内存时;如果预期字符串很长并且线程通信和同步很便宜,那将是切实可行的。例如,如果一个人有十六个处理器,并且一个人知道一个人可以安全地访问超过字符串末尾的256KB,那么可以通过调度16个处理器来处理16个4K块。每次处理器完成并且没有找到零时,它可以开始处理下一个4K块(如果它在仍在进行中的最低块的256KB内),或者等待最低处理器完成。在实践中,除非字符串真的很大,否则同步延迟和过多的工作会使并行性的任何收益失去作用,但如果需要找到一个多兆字节字符串的长度,那么任务可以并行完成。

答案 3 :(得分:0)

要并行化任务,您必须拆分输入数据并将其分派给多个线程。事先不知道字符串的长度,就无法分割数据。

所以你必须事先知道输入数据的分配大小(不一定与字符串长度相同),然后就可以了。

您的程序可能会返回可能找到的多个NUL值。只有在处理完所有NUL值之前的数据的所有线程都已完成时,您的函数才能知道找到了正确的NUL值。

假设我们将字符串拆分为8个块(0-7)。如果我们在块3中发现了NUL值,我们无法知道块0-2中是否还有其他NUL值,所以我们必须等待这些线程中的任何一个,我们可以立即停止所有其他线程。如果在线程1中找到NUL值,我们只需要等待线程0完成,这样我们就可以得到明确的答案。

答案 4 :(得分:0)

您可以在FIXED-WIDTH字符串上使用它,但不会多于此。

答案 5 :(得分:0)

这取决于架构。让多个计算单元搜索第一个空字符没有错,但是你必须让它们从内存中获得稳定的数据流。您可能希望针对确保缓存边界的确切参数执行特定于平台的调整。