一个关于如何消除数据依赖性的难题

帅气的小王子 2015-04-13 11:41:50
		for (k = 0; k < max; k++)
A[B[k]] *= C[k];

这段代码中A数组是一段包含m个元素的数组,B数组是一段包含max(max远大于m)个元素的数组,C同样是一段包含max个元素的数组。且B数组中所有元素的值都取在0-m之间。
因为这段代码包含着数据依赖性问题,所以不能直接在CUDA上并行,否则取值会有冲突与覆盖的情况。
由于需要用CUDA并行优化某个程序,类似这样的代码卡在其中,使得并行化受阻,目前只能通过将这段代码转移到CPU执行,执行完后再将结果转回GPU,由于来回传输数据,所以影响了性能。
那么问题来了,可以用什么方式让这段代码实现并行化,希望大家能给小生一些提示与帮助,在下不胜感激!
...全文
417 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
帅气的小王子 2015-04-23
  • 打赏
  • 举报
回复
引用 2 楼 ypz_2006 的回复:
不需要用文件吧,每次直接在内存里排序就行了。thrust里的sort_by_key()就行。然后用segmented_reduction把C数组乘一下,产生m个输出。最后把A数组和刚才的输出两两相乘。
十分感谢贵君的提点,小弟目前还没有thrust基础,关于您说的sort_by_key()和segmented_reduction我还没有一个具体的了解,但想必是一个比我这种土办法更优秀的解决方案,我会在以后尝试贵君提供的办法。
ypz_2006 2015-04-23
  • 打赏
  • 举报
回复
不需要用文件吧,每次直接在内存里排序就行了。thrust里的sort_by_key()就行。然后用segmented_reduction把C数组乘一下,产生m个输出。最后把A数组和刚才的输出两两相乘。
帅气的小王子 2015-04-21
  • 打赏
  • 举报
回复
终于找到解决办法,我自己来结贴。 关于这个问题,我试过很多想法,最终决定的策略是以空间换时间,即把B数组的讯息先提取特征,按照从0-m排序,存入一个文件,以后每次运行这个程序,就从文件读取这个特征,当特征分布有序以后,对0-m这些数据并行,那样就不会存在数据冲突问题啦。

581

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧