我正在分析一个呼叫详细记录的大数据集。我从mysql数据库中获取详细信息,提取用户和通话时长详细信息,并汇总每个用户的通话时长总和。
我分配了10000000大小的输出缓冲区来存储输出结果,并使用从mysql数据库获得的全部数据调用内核。在内核中,我使用原子加法来总结特定用户的持续时间。
内核代码
atomic_add(&outputbuffer[userid],duration)
效果很好。
但我担心大输出缓冲区分配。即使要得到100000个数据集的结果,我们也必须遍历整个输出内存。
我们不能在内核中做"哈希映射"之类的事情吗?我们如何使用Map reduce来解决这类问题。
每当我尝试这些方法时,我都无法避免与并行进程发生冲突。
我在这个网站上浏览了许多与我的问题相关的教程和问题。但不幸的是,我找不到任何有用的指南。
如果有人能提出解决这个问题的建议,那将会很有帮助。是否分配的全局内存量将是一个问题,是不同用户(账号,电话号码…)数量的函数。这取决于你想如何总结调用持续时间),你的cdr列表包含和你的GPU支持的全局内存量。
例如,在具有1GB内存的GPU卡上,您可能能够分配大约2.5亿个32位计数器-可能稍微少一点。这可能足以也可能不足以为您的完整一批通话记录生成持续时间摘要。如果这还不够,你将不得不把你的批分成更小的批。可用的全局内存量可以通过使用clGetDeviceInfo
OpenCL API调用请求CL_DEVICE_GLOBAL_MEM_SIZE
属性来查询。
使用更复杂的数据结构(如内核的哈希映射)的问题是,在主机端实现中的指针在设备端将没有意义(OpenCL 2.0将在这里提供解决方案)。因此,无论您设想的哈希映射实现是什么,都应该只使用基数的整数偏移量,而不是指针。然后仍然存在同步更新相同值的问题,但是您可以像在原始实现中那样使用atomic_add。
根据您的一批呼叫数据记录的特征,您可能希望按帐户、源电话号码或其他键排序检索它们,如果每个键有足够的话单(就像大型银行这样的商业客户的情况一样),您可以应用减少技术,如这里讨论的针对给定键的话单列表。