2013-05-18 55 views
0

如何计算类似下面的函数执行的周期数。我应该直接计算总和和muls和div的数量吗?我在哪里可以检查添加CUDA需要多少周期?计算CUDA内核中的周期数

__global__ 
void mandelbrotSet_per_element(Grayscale *image){ 
    float minR = -2.0f, maxR = 1.0f; 
    float minI = -1.2f, maxI = minI + (maxR-minR) * c_rows/c_cols; 
    float realFactor = (maxR - minR)/(c_cols-1); 
    float imagFactor = (maxI - minI)/(c_rows-1); 

    bool isInSet; 
    float c_real, c_imag, z_real, z_imag; 

    int y = blockDim.y * blockIdx.y + threadIdx.y; 
    int x = blockDim.x * blockIdx.x + threadIdx.x; 

    while (y < c_rows){ 
     while (x < c_cols) { 
      c_real = minR + x * realFactor; 
      c_imag = maxI - y * imagFactor; 
      z_real = c_real; z_imag = c_imag; 
      isInSet = true; 

      for (int k = 0; k < c_iterations; k++){ 
       float z_real2 = z_real * z_real; 
       float z_imag2 = z_imag * z_imag; 
       if (z_real2 + z_imag2 > 4){ 
        isInSet = false; 
        break; 
       } 
       z_imag = 2 * z_real * z_imag + c_imag; 
       z_real = z_real2 - z_imag2 + c_real; 
      } 
      if (isInSet) image[y*c_cols+x] = 255; 
      else   image[y*c_cols+x] = 0; 

      x += blockDim.x * gridDim.x; 
     } 
     x = blockDim.x * blockIdx.x + threadIdx.x; 
     y += blockDim.y * gridDim.y; 
    } 
} 

回答

0

指令吞吐量在编程指南描述here

您也可以尝试使用本地clock()功能描述here

编译器倾向于在模糊的实际运营计数测量的指令序列源代码级别(增加或可能降低表观算术强度),所以如果您想确切地确定机器正在做什么,您可能需要检查ptx(nvcc -ptx ...)或可能的机器装配级别代码,调用ed SASS,您可以使用cuobjdump实用程序从可执行文件中提取该文件。

+0

非常感谢。因此,例如,如果内核添加了8个,则所需的周期数是8/32?根据指令吞吐量? – BRabbit27

+2

如果内核在CC 2.0设备上运行的单个线程(即序列*)中执行8 SP FP添加*,并忽略其他因素(如ILP,数据停顿,注册争用,愚蠢的编译器技巧等)应该需要8个时钟,或者更准确地说,SM可以在每个时钟下退出1次(这就是*吞吐量*)。如果warp中的所有线程正在执行相同的8次添加,它将不再使用(具有相同的注意事项)。如果warp中只有8个线程正在执行相同的8次添加,则不会花费更少的时间。 –