CUDA程序优化小记(四)
CUDA全称ComputerUnifiedDevice Architecture(计算机同一设备架构),它的引入为计算机计算速度质的提升提供了可能,从此微型计算机也能有与大型机相当计算的能力。可是不恰当地使用CUDA技术,不仅不会让应用程序获得提升,反而会比普通CPU的计算还要慢。最近我通过学习《GPGPU编程技术》这本书,深刻地体会到了这一点,并且用CUDARuntime应用改写书上的例子程序;来体会CUDA技术给我们计算能力带来的提升。
原创文章,反对未声明的引用。原博客地址:http://blog.csdn.net/gamesdev/article/details/18139059
上次的并行程序能让GPU的效率得到很大的提高,因为它使用了多线程。但是这样的“多线程”显然不符合GPU通常的计算。真正的GPU计算是使用高达百万个线程的大规模并行计算,而通过CUDA的文档得知,每一个块(BLOCK)中的线程个数是一定的,有512个也有1024个。那么简单地增加并行规模的方法就是使用多个块来进行大规模计算。
于是在这样思路的指引下,将CUDA内核改为如下代码:
__global__ static voidKernel_SquareSum( int* pIn, size_t* pDataSize,
int*pOut, clock_t* pTime )
{
const size_t computeSize =*pDataSize / THREAD_NUM;
const size_t tID = size_t(threadIdx.x );// 线程
const size_t bID = size_t(blockIdx.x );// 块
// 开始计时
if ( tID == 0 ) pTime[bID] =clock( );// 选择任意一个线程进行计时
for ( size_t i = bID * THREAD_NUM+ tID;
i < DATA_SIZE;
i += BLOCK_NUM * THREAD_NUM )
{
pOut[bID * THREAD_NUM + tID] += pIn[i] * pIn[i];
}
if ( tID == 0 ) pTime[bID +BLOCK_NUM] = clock( );// 将结束时间放至后半部分
}
我们看到,这样的内核和以前的相比有亮点不同:一是将访问的间隔由1变为BLOCK_NUM * THREAD_NUM,二是计算时间的方法和前一版程序也有所不同。因为这里使用了多个处理器,每个处