diff options
Diffstat (limited to 'Canvas/gpu')
| -rw-r--r-- | Canvas/gpu/CalculateCanvas.cu | 52 | ||||
| -rw-r--r-- | Canvas/gpu/CalculateCanvas.h | 16 |
2 files changed, 68 insertions, 0 deletions
diff --git a/Canvas/gpu/CalculateCanvas.cu b/Canvas/gpu/CalculateCanvas.cu new file mode 100644 index 0000000..3a73067 --- /dev/null +++ b/Canvas/gpu/CalculateCanvas.cu @@ -0,0 +1,52 @@ +#include "CalculateCanvas.h" + +__global__ +void calculate(unsigned char* canvas, int width, Point* points, int nPoints) +{ + int canvasX = blockIdx.x * blockDim.x + threadIdx.x; + int canvasY = blockIdx.y * blockDim.y + threadIdx.y; + + int pathX, pathY; + int length_squared; + double f = 0; + + for (int i = 0; i < nPoints; i++) + { + pathX = points[i].x - canvasX; + pathY = points[i].y - canvasY; + + length_squared = pathX * pathX + pathY * pathY; + f += (1e5 * 20) / (float) length_squared; + } + + int l = (int) f; + if (l > 255) l = 255; + + canvas[canvasY * width * 3 + canvasX * 3 + 0] = l; + canvas[canvasY * width * 3 + canvasX * 3 + 1] = 0; + canvas[canvasY * width * 3 + canvasX * 3 + 2] = 0; +} + +void generate_canvas(int width, int height, unsigned char* canvas, Point* points, int nPoints) +{ + const int canvasSize = width * height * 3 * sizeof(unsigned char); + const int pointsSize = nPoints * sizeof(Point); + + unsigned char* gpuCanvas; + Point* gpuPoints; + + cudaMalloc((void**) &gpuCanvas, canvasSize); + cudaMalloc((void**) &gpuPoints, pointsSize); + + cudaMemcpy(gpuCanvas, canvas, canvasSize, cudaMemcpyHostToDevice); + cudaMemcpy(gpuPoints, points, pointsSize, cudaMemcpyHostToDevice); + + dim3 threadsPerBlock(16, 16); + dim3 numBlocks(width / threadsPerBlock.x, height / threadsPerBlock.y); + calculate<<<numBlocks, threadsPerBlock>>>(gpuCanvas, width, gpuPoints, nPoints); + + cudaMemcpy(canvas, gpuCanvas, canvasSize, cudaMemcpyDeviceToHost); + + cudaFree(gpuCanvas); + cudaFree(gpuPoints); +} diff --git a/Canvas/gpu/CalculateCanvas.h b/Canvas/gpu/CalculateCanvas.h new file mode 100644 index 0000000..0de853f --- /dev/null +++ b/Canvas/gpu/CalculateCanvas.h @@ -0,0 +1,16 @@ +// +// Created by saintruler on 05.05.19. +// + +#ifndef OPENGLTEST_CALCULATECANVAS_H +#define OPENGLTEST_CALCULATECANVAS_H + +#include <iostream> +#include <vector> +#include <fstream> + +#include <Point.h> + +void generate_canvas(int width, int height, unsigned char* canvas, Point* points, int nPoints); + +#endif //OPENGLTEST_CALCULATECANVAS_H |