计算CUDA内核中的周期数

计算CUDA内核中的周期数,cuda,gpgpu,Cuda,Gpgpu,我如何计算由如下函数执行的循环数。我应该直接计算总和、mul和div的数量吗?在哪里可以检查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

我如何计算由如下函数执行的循环数。我应该直接计算总和、mul和div的数量吗?在哪里可以检查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;
    }
}
\u全局__
每元素无效mandelbrotSet_(灰度*图像){
浮点最小值=-2.0f,最大值=1.0f;
浮点最小值=-1.2f,最大值=最小值+(最大值最小值)*c_行/c_列;
float realFactor=(maxR-minR)/(c_cols-1);
浮点imagFactor=(最大-最小)/(c_行-1);
布尔伊森塞特;
浮动c_real,c_imag,z_real,z_imag;
int y=blockDim.y*blockIdx.y+threadIdx.y;
intx=blockDim.x*blockIdx.x+threadIdx.x;
而(y4){
isInSet=false;
打破
}
z_imag=2*z_real*z_imag+c_imag;
z_real=z_real2-z_imag2+c_real;
}
如果(isInSet)图像[y*c_cols+x]=255;
else图像[y*c_cols+x]=0;
x+=blockDim.x*gridDim.x;
}
x=blockDim.x*blockIdx.x+threadIdx.x;
y+=blockDim.y*gridDim.y;
}
}

编程指南中介绍了指令吞吐量

您还可以尝试使用所述的本机
clock()
函数测量指令序列


编译器往往会掩盖源代码级别上的实际操作计数(增加或可能减少明显的算术强度),因此,如果您想准确识别机器正在执行的操作,您可能需要检查ptx(nvcc-ptx…)或可能的机器汇编级代码,称为SASS,您可以使用
cuobjdump
实用程序从可执行文件中提取该文件。

非常感谢。例如,如果内核进行8次加法,那么所需的循环数是8/32?根据指令吞吐量?如果内核在单个线程中执行8个SP FP加法,即按顺序在CC 2.0设备上运行,并忽略其他因素,如ILP、数据暂停、寄存器争用、愚蠢的编译器技巧等,那么它应该需要8个时钟,或者更准确地说,SM可以取消每个时钟1个加法(这就是吞吐量)。如果一个warp中的所有线程都在执行相同的8个add,则不再需要(使用相同的警告)。如果warp中只有8个线程在执行相同的8个add,则所需时间不会减少。