initial commit
This commit is contained in:
commit
d0c24ee291
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
build
|
8
CMakeLists.txt
Normal file
8
CMakeLists.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.12)
|
||||||
|
project(raytracing-in-a-weekend)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 14)
|
||||||
|
enable_language(CUDA)
|
||||||
|
|
||||||
|
add_executable(main src/main.cu)
|
||||||
|
set_target_properties(main PROPERTIES CUDA_ARCHITECTURES all-major)
|
6
run.sh
Executable file
6
run.sh
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
mkdir -p build
|
||||||
|
cd build
|
||||||
|
cmake ..
|
||||||
|
make
|
||||||
|
./main
|
82
src/main.cu
Normal file
82
src/main.cu
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
#include <cassert>
|
||||||
|
#include <ctime>
|
||||||
|
#include <iostream>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#define checkCudaErrors(val) check_cuda((val), #val, __FILE__, __LINE__)
|
||||||
|
|
||||||
|
void check_cuda(cudaError_t result, const char *func, const char *file, int line) {
|
||||||
|
if (result) {
|
||||||
|
std::cout << "CUDA error: " << cudaGetErrorString(result) << " (error code " << static_cast<unsigned int>(result) << ")";
|
||||||
|
std::cout << " at " << file << ":" << line << " '" << func << "' \n";
|
||||||
|
cudaDeviceReset();
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__global__ void render(float *fb, int max_x, int max_y) {
|
||||||
|
int x = threadIdx.x + blockIdx.x * blockDim.x;
|
||||||
|
int y = threadIdx.y + blockIdx.y * blockDim.y;
|
||||||
|
if ((x >= max_x) || (y >= max_y)) return;
|
||||||
|
int pixel_idx = 3*(y*max_x + x);
|
||||||
|
|
||||||
|
fb[pixel_idx + 0] = float(x) / max_x;
|
||||||
|
fb[pixel_idx + 1] = float(y) / max_y;
|
||||||
|
fb[pixel_idx + 2] = 0.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
const char *image_filename = "image.ppm";
|
||||||
|
int nx = 1200;
|
||||||
|
int ny = 600;
|
||||||
|
int tx = 8;
|
||||||
|
int ty = 8;
|
||||||
|
|
||||||
|
int num_pixels = nx*ny;
|
||||||
|
size_t fb_size = 3*num_pixels*sizeof(float);
|
||||||
|
|
||||||
|
float *fb;
|
||||||
|
checkCudaErrors(cudaMallocManaged(&fb, fb_size));
|
||||||
|
|
||||||
|
clock_t start = clock();
|
||||||
|
{
|
||||||
|
dim3 blocks(nx/tx+1, ny/ty+1);
|
||||||
|
dim3 threads(tx, ty);
|
||||||
|
|
||||||
|
render<<<blocks, threads>>>(fb, nx, ny);
|
||||||
|
checkCudaErrors(cudaGetLastError());
|
||||||
|
checkCudaErrors(cudaDeviceSynchronize());
|
||||||
|
}
|
||||||
|
clock_t stop = clock();
|
||||||
|
double timer_seconds = ((double)(stop - start)) / CLOCKS_PER_SEC;
|
||||||
|
std::cout << "took " << timer_seconds << " seconds.\n";
|
||||||
|
|
||||||
|
FILE *f = fopen(image_filename, "w");
|
||||||
|
assert(f);
|
||||||
|
|
||||||
|
char header[128] = { 0 };
|
||||||
|
int header_size = snprintf(header, sizeof(header), "P3\n%d %d\n255\n", nx, ny);
|
||||||
|
fwrite(header, header_size, 1, f);
|
||||||
|
|
||||||
|
for (int y=ny-1; y >= 0; y--) {
|
||||||
|
for (int x=0; x < nx; x++) {
|
||||||
|
size_t pixel_idx = 3*(y*nx + x);
|
||||||
|
float r = fb[pixel_idx + 0];
|
||||||
|
float g = fb[pixel_idx + 1];
|
||||||
|
float b = fb[pixel_idx + 2];
|
||||||
|
int ir = int(255.99*r);
|
||||||
|
int ig = int(255.99*g);
|
||||||
|
int ib = int(255.99*b);
|
||||||
|
|
||||||
|
char pixel_str[128] = { 0 };
|
||||||
|
int str_size = snprintf(pixel_str, sizeof(pixel_str), "%d %d %d\n", ir, ig, ib);
|
||||||
|
fwrite(pixel_str, str_size, 1, f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
checkCudaErrors(cudaFree(fb));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user