X-Git-Url: http://git.euphorik.ch/?p=GPU.git;a=blobdiff_plain;f=WCudaMSE%2FStudent_Cuda_Image%2Fsrc%2Fcpp%2Fcore%2F05_HeatTransfert%2Fmoo%2Fhost%2FHeatTransfert.cu;fp=WCudaMSE%2FStudent_Cuda_Image%2Fsrc%2Fcpp%2Fcore%2F05_HeatTransfert%2Fmoo%2Fhost%2FHeatTransfert.cu;h=7aa7cf6b3de8a6ba8c35d58e4772342b461b98cc;hp=0000000000000000000000000000000000000000;hb=cb39d6a91b65d2862018430d65e633d2a8fdc818;hpb=2d95edd9a2d09421e5eae56755bdf3105e12edf7 diff --git a/WCudaMSE/Student_Cuda_Image/src/cpp/core/05_HeatTransfert/moo/host/HeatTransfert.cu b/WCudaMSE/Student_Cuda_Image/src/cpp/core/05_HeatTransfert/moo/host/HeatTransfert.cu new file mode 100755 index 0000000..7aa7cf6 --- /dev/null +++ b/WCudaMSE/Student_Cuda_Image/src/cpp/core/05_HeatTransfert/moo/host/HeatTransfert.cu @@ -0,0 +1,119 @@ +#include "HeatTransfert.h" + +#include +#include +#include +#include +using namespace std; + +#include "Device.h" + +#include "HeatTransfertDevice.h" + +HeatTransfert::HeatTransfert() : + calibreur(IntervalF(0, 1), IntervalF(0.7, 0)), + devImageHeaters(800, 800), + devImageA(800, 800), + devImageB(800, 800), + t(0), + dg(8, 8, 1), + db(32, 32, 1), + title("Heat transfert") + { + const size_t IMAGE_SIZE = this->devImageA.getW() * this->devImageA.getH() * sizeof(float); + const int IMAGE_W = this->devImageA.getW(); + const int IMAGE_H = this->devImageA.getH(); + + // Définition des heaters. + HeatImage imageHeaters(IMAGE_W, IMAGE_H, new float[IMAGE_W * IMAGE_H]); + imageHeaters.clear(); + setHeaters(imageHeaters); + + // Définition des températures initiales (toutes à zero). + HeatImage imageInit(IMAGE_W, IMAGE_H, new float[IMAGE_W * IMAGE_H]); + imageInit.clear(); + + // Copie des heaters en GM. + HANDLE_ERROR(cudaMalloc(&this->devImageHeaters.getRaw(), IMAGE_SIZE)); + HANDLE_ERROR(cudaMemcpy(this->devImageHeaters.getRaw(), imageHeaters.getRaw(), IMAGE_SIZE, cudaMemcpyHostToDevice)); + + // Allocation de image A et image B. + HANDLE_ERROR(cudaMalloc(&this->devImageA.getRaw(), IMAGE_SIZE)); + HANDLE_ERROR(cudaMemcpy(this->devImageA.getRaw(), imageInit.getRaw(), IMAGE_SIZE, cudaMemcpyHostToDevice)); + HANDLE_ERROR(cudaMalloc(&this->devImageB.getRaw(), IMAGE_SIZE)); + HANDLE_ERROR(cudaMemcpy(this->devImageB.getRaw(), imageInit.getRaw(), IMAGE_SIZE, cudaMemcpyHostToDevice)); + } + +HeatTransfert::~HeatTransfert() + { + cudaFree(this->devImageHeaters.getRaw()); + cudaFree(this->devImageA.getRaw()); + cudaFree(this->devImageB.getRaw()); + } + +void HeatTransfert::runGPU(uchar4* ptrDevPixels) + { + for (int i = 0; i < NB_ITERATION_AVEUGLE; i++) + { + copyHeaters<<>>(this->devImageHeaters, this->devImageA); // Copie les heaters dans l'image A. + diffuseMethode1<<>>(this->devImageA, this->devImageB); // Diffuse l'image A dans l'image B. + this->devImageA.swapWith(this->devImageB); // Swap l'image A et l'image B. + } + + display<<>>(this->devImageA, ptrDevPixels, this->calibreur); // Affiche l'image A (pour avoir les heaters intacts ). + + //HANDLE_ERROR(cudaDeviceSynchronize()); // Pour flusher les 'printf' (pour le DEBUG). + } + +void HeatTransfert::animationStep() + { + this->t += NB_ITERATION_AVEUGLE; + } + +int HeatTransfert::getW() + { + return this->devImageA.getW(); + } + +int HeatTransfert::getH() + { + return this->devImageA.getH(); + } + +float HeatTransfert::getT() + { + return float(this->t); + } + +string HeatTransfert::getTitle() + { + return this->title; + } + +void HeatTransfert::setHeaters(HeatImage& image) + { + for (int x = 179; x <= 195; x++) + { + for (int y = 179; y <= 195; y++) + image.set(x, y, 0.2); + for (int y = 605; y <= 621; y++) + image.set(x, y, 0.2); + } + + for (int x = 605; x <= 621; x++) + { + for (int y = 179; y <= 195; y++) + image.set(x, y, 0.2); + for (int y = 605; y <= 621; y++) + image.set(x, y, 0.2); + } + + image.set(295, 400, 0.2); + image.set(400, 295, 0.2); + image.set(505, 400, 0.2); + image.set(400, 505, 0.2); + + for (int x = 300; x <= 500; x++) + for (int y = 300; y <= 500; y++) + image.set(x, y, 1); + }