文档过滤设计示例

建议用于:

  • 设备:不详

  • Quartus®:v17.1

author-image

作者

此示例提供了一个布隆过滤器如何帮助提高应用程序性能的示例。

文档过滤涉及查看传入的文档流并找到最符合用户兴趣的文档。此类系统的一个示例是使用过滤机制,该机制监视新闻源并将相关文章发送到用户的电子邮件账户。通常,此应用程序是对非结构化数据(例如文本文件、HTML 页面、电子邮件和视频文件)执行分析的示例。据估计,高达 80% 的企业相关数据都是非结构化形式。

该算法尝试为特定搜索配置文件找到最佳匹配文档。搜索配置文件是将文档与用户感兴趣的主题进行匹配的过滤器。为此,将每个文档缩减为一组单词,以及文档中每个单词出现的频率。文档中的每个词频对 (t_i; f_i) 表示为 32 位整数,具有 24 位词条 ID 和 8 位出现频率。词条通常是文档中的单词。24 位 ID 可以做到一个超过 1600 万个词条的词汇表。搜索配置文件由一组较少的词条和每个词条的权重组成,用于指定其在搜索配置文件中的相对重要性。权重由定点表示的 64 位数字组成。为了执行非结构化搜索,会为每个文档计算一个分数,以确定其与给定配置文件的相关性。

内核的输入数据如下:

  • docWordFrequencies 代表您希望通过内核运行的所有文档。每个 32 位整数代表文档中的一个词条或单词。前 24 位是词条 ID,后 8 位是该词条在文档中出现的频率。
  • profileWeights 是搜索配置文件。它由一组较少的词条和每个术语的权重组成,用于指定其在搜索配置文件中的相对重要性。权重由定点表示的 64 位数字组成。
  • isWordInProfileHash 是布隆过滤器。对于 profileWeights 数组中存在的每个具有非零权重的词条 ID,我们在主机上根据它计算两个哈希值。然后我们将计算出的值插入到布隆过滤器中。然后,在内核执行期间,为文档中存在的每个词条 ID 计算两个哈希值。我们在布隆过滤器中查找这些哈希值。如果任一哈希值不存在,则意味着该词条 ID 不在搜索配置文件中。如果找到两个哈希值,我们将对 profileWeights 数组执行内存访问。

内核的输出数据为:

  1. profileScorePerGroup_highbits 是我们计算的每个文档的分数的较高 32 位。
  2. profileScorePerGroup_lowbits 是我们计算的每个文档的分数的较低 32 位。

综合起来,这表示文档的分数,表明其与给定配置文件的相关性。为了进一步提高此应用程序的吞吐量,我们将输入分成两个大小相等的部分,分别位于每个 DDR 内存库中。这由附加到内核参数的 _dimm1(对于第一个 DIMM)和 _dimm2(对于第二个 DIMM)表示。这样通过利用两个可用的内存库,进一步提高了我们的性能。

下载

该设计示例提供 OpenCL™ 设备 (.cl) 和主机应用程序的源代码。为了编译主机应用程序,Linux* 包包含一个 Makefile,Windows 包包含一个 Microsoft Visual Studio 2010 项目。

本示例提供以下下载:

该设计的使用受硬件参考设计许可协议中条款和条件的管理和约束。

要下载英特尔设计工具,请访问 OpenCL 下载页面。对底层操作系统的要求与英特尔® FPGA SDK for OpenCL 的要求相同。

OpenCL 和 OpenCL 标识是苹果公司的商标,需获得 Khronos 的许可方能使用。

*产品基于已发布的 Khronos 规范,并已通过 Khronos 一致性测试流程。最新的一致性状态信息可以在 www.khronos.org/conformance 上找到。

软件和硬件要求