高效搜索数组中的一系列值?理想的OpenCL可用吗? 我有一个巨大的数组需要搜索(实际上它是一个数组的小数组,但出于所有的意图和目的,让我们把它看作一个巨大的数组)。我需要找到的是一系列具体的数字。显然,一个简单的for循环将起作用: Pseudocode: for(x = 0; x++) { if(array[x] == searchfor[location]) location++; else location = 0; if(location >= strlen(searchfor)) return FOUND_IT; }

高效搜索数组中的一系列值?理想的OpenCL可用吗? 我有一个巨大的数组需要搜索(实际上它是一个数组的小数组,但出于所有的意图和目的,让我们把它看作一个巨大的数组)。我需要找到的是一系列具体的数字。显然,一个简单的for循环将起作用: Pseudocode: for(x = 0; x++) { if(array[x] == searchfor[location]) location++; else location = 0; if(location >= strlen(searchfor)) return FOUND_IT; },c,arrays,search,opencl,C,Arrays,Search,Opencl,问题是我希望这是有效率的。在一个完美的世界中,我不想从OpenCL内核返回准备好的数据并进行简单的搜索循环 我对非OpenCL的想法持开放态度,但我可以在1024个目标数组长度上跨64个工作组实现的东西将是理想的 我在讨论一些想法(将目标划分为多个工作项,比较每个工作项,循环,与每个目标进行比较,如果匹配,则设置一个标志。在所有工作项完成后,检查标志。尽管在我写这篇文章时,这听起来非常低效),但我确信我遗漏了一些东西 另一个想法是,由于目标数组是uchar,所以将其作为一个double组合在一起

问题是我希望这是有效率的。在一个完美的世界中,我不想从OpenCL内核返回准备好的数据并进行简单的搜索循环

我对非OpenCL的想法持开放态度,但我可以在1024个目标数组长度上跨64个工作组实现的东西将是理想的

我在讨论一些想法(将目标划分为多个工作项,比较每个工作项,循环,与每个目标进行比较,如果匹配,则设置一个标志。在所有工作项完成后,检查标志。尽管在我写这篇文章时,这听起来非常低效),但我确信我遗漏了一些东西

另一个想法是,由于目标数组是uchar,所以将其作为一个double组合在一起,一次检查8个索引。我不确定我能在opencl中轻松做到这一点

还可以考虑使用一些快速的、可能是MD5的东西对搜索目标进行散列,然后一次抓取strlen(searchtarget)字符,对其进行散列,并查看是否匹配。不过,我不确定散列会在多大程度上降低我的搜索速度


O--代码是C,所以没有C++的映射(我在Google中发现的东西看起来好像有帮助)

< P>基于上面的注释,对于未来的搜索来说,似乎是简单的循环扫描,在给定OpenCL实现的情况下,范围是最有效的查找匹配的方式。在给定OpenCL实现的情况下,循环扫描范围似乎是查找匹配项的最有效方法。

创建索引数组[sizeof uchar]。对于搜索字符串中的每个uchar,使数组[uchar]=第一次出现uchar时在搜索字符串中的位置。数组的其余部分包含-1

unsigned searchindexing[sizeof char] = { (unsigned)-1};
memcpy(searchindexing + 1, searchindexing, sizeof char - 1);
for (i = 0; i < strlen(searchfor); i++)
  searchindexing[searchfor[i]] = i;
无符号搜索索引[sizeof char]={(无符号)-1};
memcpy(searchindexing+1,searchindexing,sizeof char-1);
for(i=0;i
如果你不从一开始就开始,一次以上发生的uchar将在搜索索引中输入错误的位置

然后通过单步执行strlen(searchfor)来搜索数组,除非从searchfor中找到uchar

for (i = 0; i < MAXARRAYLEN; i += strlen(searchfor))
  if ((unsigned)-1 != searchindexing[array[i]]) {
    i -= searchindexing[array[i]];
    if (!memcmp(searchfor, &array[i], strlen(searchfor)))
      return FOUND_IT;
  }
for(i=0;i
如果阵列中的大多数uchar不在搜索中,这可能是最快的方法。注意,代码尚未优化


示例:searchfor=“banana”。斯特伦6岁。searchindexing['a']=5、['b']=0、['n']=4,其余的值不在0到5之间,如-1或maxuint。如果数组[i]不是香蕉形空间中的某个对象,则i递增6。如果数组[i]现在是'a',您可能在香蕉中,它可以是3'a中的任何一个。因此,我们假设最后一个“a”,将5个位置移回,并与searchfor进行比较。如果成功,我们将找到它,否则我们将前进6步。

创建索引数组[sizeof uchar]。对于搜索字符串中的每个uchar,使数组[uchar]=第一次出现uchar时在搜索字符串中的位置。数组的其余部分包含-1

unsigned searchindexing[sizeof char] = { (unsigned)-1};
memcpy(searchindexing + 1, searchindexing, sizeof char - 1);
for (i = 0; i < strlen(searchfor); i++)
  searchindexing[searchfor[i]] = i;
无符号搜索索引[sizeof char]={(无符号)-1};
memcpy(searchindexing+1,searchindexing,sizeof char-1);
for(i=0;i
如果你不从一开始就开始,一次以上发生的uchar将在搜索索引中输入错误的位置

然后通过单步执行strlen(searchfor)来搜索数组,除非从searchfor中找到uchar

for (i = 0; i < MAXARRAYLEN; i += strlen(searchfor))
  if ((unsigned)-1 != searchindexing[array[i]]) {
    i -= searchindexing[array[i]];
    if (!memcmp(searchfor, &array[i], strlen(searchfor)))
      return FOUND_IT;
  }
for(i=0;i
如果阵列中的大多数uchar不在搜索中,这可能是最快的方法。注意,代码尚未优化


示例:searchfor=“banana”。斯特伦6岁。searchindexing['a']=5、['b']=0、['n']=4,其余的值不在0到5之间,如-1或maxuint。如果数组[i]不是香蕉形空间中的某个对象,则i递增6。如果数组[i]现在是'a',您可能在香蕉中,它可以是3'a中的任何一个。因此,我们假设最后一个“a”,将5个位置移回,并与searchfor进行比较。如果成功,我们会找到它,否则我们将前进6步。

memmem()如何-允许gnu扩展吗?哈希对您没有帮助。计算n个项目的散列比只对每个项目进行比较要昂贵得多。通过将数据视为不同的类型来复用这些数据会在C99中产生未定义的行为,这在OpenCL上下文中似乎是一个特别糟糕的问题,其重点是异构硬件。它还要求您通过未对齐的指针读取数据,这本身也会产生未定义的行为。除非数据具有某种结构,您可以利用这种结构简化搜索,否则除了直接向上搜索之外,没有其他好方法。但是,您可以将工作数组拆分为块,并并行搜索每个块。确保重叠块的末端,这样你的目标就不会因为被分成两块而逃避检测。这似乎比拆分目标要简单得多,而且它的优点是任何定位目标的任务都可以提前退出。使用memchr()在数组中搜索与搜索字符串的第一个字符相等的位置,然后比较字符串。memchr()通常会根据您使用的编译器进行优化。memmem()呢?允许gnu扩展吗?哈希对您没有帮助。它更贵