哎呀其实我想一点点的写我的注释粘贴代码的,但是确实很麻烦,我说这里的编辑器让我不舒服,哈哈
#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代码,我晕了,每次发布还要审批,我都觉得挺麻烦审批员的,哈哈
这是运行结果,这是个动态的,但是这里截图一帧的图像啦,还不错