我正在分析一个大型的Call Detail Records数据集。我从mysql数据库中获取详细信息并提取用户和呼叫持续时间的详细信息,并汇总每个用户的呼叫持续时间总和。
我分配了10000000大小的输出缓冲区来存储输出结果,并调用了来自mysql数据库的整个数据的内核。在内核中,我使用原子加法来总结特定用户的持续时间。
在内核代码中
atomic_add(&outputbuffer[userid],duration)
完美无缺。
但我担心大输出缓冲区分配。即使要获得100000数据集的结果,我们也必须通过整个输出存储器。
我们不能在内核中做“哈希映射”这种事吗?我们如何使用“Map reduce”来解决这类问题。
每当我尝试这种方法时,我都无法避免与并行进程发生冲突。
我在本网站上经历了许多与我的问题相关的教程和问题。但遗憾的是,我无法获得任何有用的指南。
如果有人建议解决这个问题的想法,那将会有所帮助。
提前致谢。
答案 0 :(得分:0)
您分配的全局内存量是否有问题取决于您的列表中不同用户的数量(帐号,电话号码......取决于您希望如何汇总呼叫持续时间) CDR包含GPU支持的全局内存量。
例如,在具有1GB内存的GPU卡上,您可以分配大约2.5亿个32位计数器 - 可能会少一些。这可能会或可能不足以为您的整批通话记录生成持续时间摘要。如果这还不够,则必须以较小的批次拆分批次。通过使用CL_DEVICE_GLOBAL_MEM_SIZE
OpenCL API调用请求clGetDeviceInfo
属性,可以查询可用的全局内存量。
使用更复杂的数据结构(例如来自内核的哈希映射)的问题是,在主机端的实现中的指针在设备端将毫无意义(OpenCL 2.0将在此提供解决方案)。因此,您设想的任何哈希映射实现应该只使用其基础的整数偏移而不是指针。然后仍然存在同时更新同一值的同步问题,但您可以像在原始实现中一样使用atomic_add。
根据您的一批呼叫数据记录的特征,您可能希望按帐户,源电话号码或其他密钥排序并检查每个密钥是否有足够的CDR(如同商业客户的情况一样)一家大型银行)您可以在给定密钥的CDR列表中应用缩减技术,如讨论的here。
希望这会给你一些想法。