我想知道尝试编写strlen
函数以\0
并行查找序列是否有任何优点。如果是这样,这样的功能应该考虑什么?谢谢。
6 回答
strlen()
精神上是连续的 - 超出空终止符的一步是未定义的行为,空终止符可以在任何地方 - 第一个字符或第一个字符,因此您必须按顺序扫描。
您必须确保NUL
线程找到的是NUL
字符串中的第一个,这意味着线程需要同步它们的最低NUL
位置。因此,虽然可以做到这一点,但同步的开销将远远超过并行化的任何潜在收益。
此外,还有缓存问题。单个线程可以连续读取一个字符串,这是缓存友好的。多个线程冒着踩到彼此脚趾的风险。
这在某些并行架构上是可能的,但前提是可以保证可以安全访问字符串之外的大量内存;只有当字符串很长并且线程通信和同步很便宜时才实用。例如,如果一个人有 16 个处理器,并且知道可以安全地访问超出字符串末尾的 256KB,则可以从调度 16 个处理器开始处理 16 个 4K 块。每次处理器完成并且没有找到零时,它可以开始处理下一个 4K 块(如果它在仍在进行中的最低块的 256KB 范围内),或者等待最低处理器完成。在实践中,除非字符串真的很大,否则同步延迟和过多的工作将无法从并行性中获得任何收益,
要并行化任务,您必须拆分输入数据并将其分派到多个线程。如果事先不知道字符串的长度,就无法拆分数据。
所以你必须事先知道输入数据的分配大小(不一定与字符串长度相同),然后才能工作。
您的程序可能会返回多个可能已找到的 NUL 值。只有当所有处理在找到的任何 NUL 值之前出现的数据的线程都已完成时,您的函数才能知道已找到正确的 NUL 值。
假设我们将字符串分成 8 个块 (0-7)。如果我们在块 3 中找到 NUL 值,我们无法知道块 0-2 中是否还有其他 NUL 值,因此我们必须等待这些线程中的任何一个,我们可以立即停止所有其他线程。如果在线程 1 中找到 NUL 值,我们只需要等待线程 0 完成,因此我们可以获得明确的答案。
您可以在 FIXED-WIDTH 字符串上使用它,但仅此而已。
这取决于架构。让多个计算单元寻找第一个空字符并没有错,但是您必须让它们从内存中获得稳定的数据流。您可能希望针对确切的参数执行特定于平台的调整,同时牢记缓存边界。