绘制波浪线--GPU高性能编程CUDA实战5.2.2

时间:2022-08-11 16:31:48
哎呀其实我想一点点的写我的注释粘贴代码的,但是确实很麻烦,我说这里的编辑器让我不舒服,哈哈
#include "cuda.h"
#include "../common/book.h"
#include "../common/cpu_anim.h"
//DIM定义的是像素,这里是512*512大小的图像
#define DIM 512
//没见到PI在哪里用上了
#define PI 3.1415926535897932f
//核函数里的ticks我没有见到哪里调用,这个就是有关于时间方面的,系统自动填充吧
__global__ void kernel( unsigned char *ptr, int ticks ) {
    // map from threadIdx/BlockIdx to pixel position
	//这里就是索引,图像中每一个像素在线程中的位置,这里的线程格是二维的,线程块也是二维的,画个图就容易理解,这里的横坐标就是在线程块中的x位置+这个线程块在线程格里的x上位置
	//*线程块x上的总线程数。y是线程在线程块里y的位置+这个线程块在线程格里的y上位置*线程块里y上的总线程数
    int x = threadIdx.x + blockIdx.x * blockDim.x;
    int y = threadIdx.y + blockIdx.y * blockDim.y;
	//然后定位这个像素点在存储器里的位置,可以理解成所有线程(512*512个线程)在排成一排的时候它的位置,位置在第y排的第x个,所以是x+y*线程块x上线程的总个数*线程格里x上线程块的总个数
    int offset = x + y * blockDim.x * gridDim.x;
    // now calculate the value at that position
	//这里是吧波纹的图像放在了正中间,如果不减去DIM/2的话,他会在左下角(就当是坐标原点吧),如果减去的是DIM/3,那么原点就会在坐标轴(1/3,1/3)的位置上
    float fx = x- DIM/2;
    float fy = y- DIM/2;
	//这是实验上的能直接看出来的,但是下面两行我不懂事什么意思,既然没个像素点都执行这个函数,所以每个函数的d值是不一样的,ticks值应该是随时间同时变化的
	//d代表了什么?如果不减去DIM/2的话,就是像素点与原点的距离,减去刚才数字的话,就应该是这个像素点到(1/2,1/2)位置上的距离
    float d = sqrtf( fx * fx + fy * fy );
	//这个图像啊,其实是一个cos图像,随时间ticks在z轴上的大小,我们的图像是x和y轴,大小的改变呢,就把这个变化值放在生成的RGBA模型里,就显出来波浪形了,里面的数字的含义啊,数学没学好,不知道
<strong><span style="font-size:18px;background-color: rgb(204, 51, 204);">这里如果有谁知道什么意思的话,记得告诉我啊!!</span></strong>
    unsigned char grey = (unsigned char)(128.0f + 127.0f * cos(d/10.0f - ticks/7.0f)/(d/10.0f + 1.0f));    
    ptr[offset*4 + 0] = grey;
    ptr[offset*4 + 1] = grey;
    ptr[offset*4 + 2] = grey;
    ptr[offset*4 + 3] = 255;
}

struct DataBlock {
    unsigned char   *dev_bitmap;
    CPUAnimBitmap  *bitmap;
};

//这里调用的时候我很纠结,我没见过,(void (*)(void*,int))generate_frame,这样调用的,一开始没看懂,现在也不懂,只是想了想,这个的参数是提前了的,我没见过这种方式的含义,留作疑问(我导师没回答呢,不知道忙什么去了)
void generate_frame( DataBlock *d, int ticks ) {
	//ticks在这里是哪里给值了啊晕,下面是分配线程运行的,二维线程块32*32个,每一个线程块16*16个,这个是解决硬件限制的,因为一个线程块里能生成的线程有限,我的是1024个,没有问题。
	dim3    blocks(DIM/16,DIM/16);
    dim3    threads(16,16);
    kernel<<<blocks,threads>>>( d->dev_bitmap, ticks );

    HANDLE_ERROR( cudaMemcpy( d->bitmap->get_ptr(),
                              d->dev_bitmap,
                              d->bitmap->image_size(),
                              cudaMemcpyDeviceToHost ) );
}

// clean up memory allocated on the GPU
void cleanup( DataBlock *d ) {
    HANDLE_ERROR( cudaFree( d->dev_bitmap ) ); 
}

int main( void ) {
    DataBlock   data;
    CPUAnimBitmap  bitmap( DIM, DIM, &data );
    data.bitmap = &bitmap;

    HANDLE_ERROR( cudaMalloc( (void**)&data.dev_bitmap,
                              bitmap.image_size() ) );
	//每一次运行,然后都要清除GPU内存的数据从新生成,感觉很有优化的空间,只是感觉
    bitmap.anim_and_exit( (void (*)(void*,int))generate_frame,
                            (void (*)(void*))cleanup );
}

我的天我已经改了三次的,因为这个编辑器,我想写字的时候,老是处代码,想加颜色,醒目一些,最后老变成一堆html代码,我晕了,每次发布还要审批,我都觉得挺麻烦审批员的,哈哈

这是运行结果,这是个动态的,但是这里截图一帧的图像啦,还不错

绘制波浪线--GPU高性能编程CUDA实战5.2.2