
问题1:基于任务的并行与基于数据的并行有什么区别吗?
答:有区别,前者往往是cpu上的当时,而后者往往是gpu上的。前者可以看成只有一个work-item的kernel实例。
最初OpenCL有两种工作模型的。包括任务并行的(clEnqueueTask),如上所述, 可以看成是(1,1,1)个work-item的一次kernel启动。但是从OpenCL2.0起,将此模型启用。因为基本上除了CPU外,常见的GPU并不能很有效的执行此模型下的kernel实例。在GPU上的常见做法依然建议使用数据并行的(一份kernel代码, N个work-item在同时执行它, 但对应不同的数据)。CUDA从来只建议使用数据并行的, 否则将十分低效。(因为如前所述, 相当于只有1个线程的kernel了, 对于CUDA来说)。
问题2:GPU点对点通信是什么意思?
答:CUDA的P2P Access和P2P Copy。(P2P = peer to peer)
一张显卡可以从同一个PCI-E Root Switch/Complex下的另外一张显卡身上,直接访问对方的显存, 或者直接的将对方的显存里面的东西复制到自己的显存里。数据只走PCI-E, 而无需经过内存二次倒手。这样可以提高性能。但是NV的P2P Copy总是开放的, 但P2P Access需要买专业卡。从函数实现上,例如cudaMemcpyPeer*()以及 cudaMemcpy*()。后者需要使用cudaMemcpyDefault+UVA,才能实现跨卡传输。无UVA请老老实实的使用cudaMemcpyPeer*()。