在本案例中,计算方法主要为创建clock_t变量进入内核函数内部记录时钟周期数,然后将每次记录得到的数据写入device memory中传回内存,最后计算平均值输出。我将案例中最主要的计时部分列了下来方便大家进行参考。
{
clock_t *dtimer = NULL;
clock_t timer[NUM_BLOCKS * 2];//numblocks即为块的个数
checkCudaErrors(cudaMalloc((void **)&dtimer, sizeof(clock_t) * NUM_BLOCKS * 2));
timedReduction<<<NUM_BLOCKS, NUM_THREADS, sizeof(float) * 2 *NUM_THREADS>>>(dinput, doutput, dtimer);
checkCudaErrors(cudaMemcpy(timer, dtimer, sizeof(clock_t) * NUM_BLOCKS * 2, cudaMemcpyDeviceToHost));
//计算出平均每一块的性能
long double avgElapsedClocks = 0;
for (int i = 0; i < NUM_BLOCKS; i++)
{
avgElapsedClocks += (long double) (timer[i + NUM_BLOCKS] - timer[i]);
}
avgElapsedClocks = avgElapsedClocks/NUM_BLOCKS;
printf("Average clocks/block = %Lf\n", avgElapsedClocks);
}
__global__ void timedReduction(const float *input, float *output, clock_t *timer)
{
if (tid == 0) timer[bid] = clock();

最低0.47元/天 解锁文章
213

被折叠的 条评论
为什么被折叠?



