CUDA全局内存事务中的“合并”是什么? 即使通过我的CUDA指南,我也无法理解。 怎么做? 在CUDA编程指南matrix的例子中,一行一行地访问matrix称为“合并”(coalesced)或col .. col。被称为合并(coalesced) 这是正确的,为什么?
编辑 :为了参考的目的(如果有人绊倒这个问题),Igor Ostrovsky写了一个关于caching未命中的伟大的职位 。 它讨论了几个不同的问题,并显示示例编号。 结束编辑 我做了一些testing<long story goes here>并且想知道性能差异是否是由于内存caching未命中所致。 下面的代码演示了这个问题,并将其归结为关键的时间部分。 下面的代码有几个循环,以随机顺序访问内存,然后按升序地址顺序访问。 我在XP机器(用VS2005:cl / O2编译)和Linux机器上(gcc -Os)运行它。 两者产生了类似的时间 这些时间以毫秒为单位。 我相信所有循环都在运行,没有被优化(否则它会“立即”运行)。 ***testing20000个节点 总有序时间:888.822899 总计随机时间:2155.846268 这些数字是否有意义? 主要是由于一级caching未命中还是其他事情呢? 有2万2 ^ 2的内存访问,如果每一个都是一个caching未命中,那就是每个小姐约3.2纳秒。 我testing的XP(P4)机器是3.2GHz,我怀疑(但不知道)有一个32KB L1caching和512KB L2。 有20,000个参赛作品(80KB),我认为没有大量的L2错失。 所以这将是(3.2*10^9 cycles/second) * 3.2*10^-9 seconds/miss) = 10.1 cycles/miss 。 这对我来说似乎很高。 也许这不是,或者我的math不好。 我试着测量与VTune的caching未命中,但我有一个BSOD。 现在我无法连接到许可证服务器(grrrr)。 typedef struct stItem { long lData; //char acPad[20]; } LIST_NODE; #if […]
通过指针的内存访问被认为比通过数组的内存访问更有效率。 我正在学习C,上面的内容在K&R中有说明。 具体他们说 任何可以通过数组下标来实现的操作也可以用指针来完成。 指针版本通常会更快 我使用visual C ++拆分了下面的代码(Mine是一个686处理器,我禁用了所有的优化)。 int a[10], *p = a, temp; void foo() { temp = a[0]; temp = *p; } 令我惊讶的是,我发现通过指针访问内存需要3条指令才能通过数组访问内存。 以下是相应的代码。 ; 5 : temp = a[0]; mov eax, DWORD PTR _a mov DWORD PTR _temp, eax ; 6 : temp = *p; mov eax, DWORD PTR _p mov ecx, […]