From 1856b2bad76e19ffec1ecb3ca3c5992eb60e0244 Mon Sep 17 00:00:00 2001 From: JayjeetAtGithub Date: Sat, 17 Aug 2024 19:10:49 -0700 Subject: [PATCH 1/3] Add thrust algorithms --- 005_thrust_algos/Makefile | 9 +++++++++ 005_thrust_algos/algos.cu | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 005_thrust_algos/Makefile create mode 100644 005_thrust_algos/algos.cu diff --git a/005_thrust_algos/Makefile b/005_thrust_algos/Makefile new file mode 100644 index 0000000..a79bd9c --- /dev/null +++ b/005_thrust_algos/Makefile @@ -0,0 +1,9 @@ +all: hw + +hw: + nvcc -x cu -O3 -std=c++20 --extended-lambda -arch=sm_86 -I/usr/local/cuda-12.2/bin/../include ./algos.cu -o main -L/usr/local/cuda-12.2/bin/../lib64 + +clean: + rm -f main + +.PHONY: clean hw diff --git a/005_thrust_algos/algos.cu b/005_thrust_algos/algos.cu new file mode 100644 index 0000000..fb9cebc --- /dev/null +++ b/005_thrust_algos/algos.cu @@ -0,0 +1,35 @@ +#include +#include + +void print_vector(thrust::device_vector v) { + thrust::for_each(v.begin(), v.end(), [] __host__ __device__(int val) { + printf("%d ", val); + }); + std::cout << std::endl; +} + +int main() { + // Sorting + { + std::vector h_vec{3, 1, 4, 2, 8, 5, 9, 12, 6}; + thrust::device_vector d_vec = h_vec; + thrust::sort( + thrust::device, + d_vec.begin(), + d_vec.end() + ); + print_vector(d_vec); + } + + // Filling + { + thrust::device_vector d_vec(10); + thrust::fill( + thrust::device, + d_vec.begin(), + d_vec.end(), + 101 + ); + print_vector(d_vec); + } +} From 1800dfac8651821b95a3e120ef6627f6300a7c54 Mon Sep 17 00:00:00 2001 From: JayjeetAtGithub Date: Sat, 17 Aug 2024 19:15:05 -0700 Subject: [PATCH 2/3] Add sequence example --- 005_thrust_algos/algos.cu | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/005_thrust_algos/algos.cu b/005_thrust_algos/algos.cu index fb9cebc..6f0af3c 100644 --- a/005_thrust_algos/algos.cu +++ b/005_thrust_algos/algos.cu @@ -32,4 +32,15 @@ int main() { ); print_vector(d_vec); } + + // Sequence + { + thrust::device_vector d_vec(10); + thrust::sequence( + thrust::device, + d_vec.begin(), + d_vec.end() + ); + print_vector(d_vec); + } } From fcf554f5f17e07b98762358524a0c9a057dfac0d Mon Sep 17 00:00:00 2001 From: JayjeetAtGithub Date: Sat, 17 Aug 2024 19:28:20 -0700 Subject: [PATCH 3/3] Add merge and transform --- 005_thrust_algos/algos.cu | 45 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/005_thrust_algos/algos.cu b/005_thrust_algos/algos.cu index 6f0af3c..993ddb2 100644 --- a/005_thrust_algos/algos.cu +++ b/005_thrust_algos/algos.cu @@ -1,6 +1,13 @@ #include #include +struct plus_one_functor { + __device__ + int operator()(int x) { + return x + 1; + } +}; + void print_vector(thrust::device_vector v) { thrust::for_each(v.begin(), v.end(), [] __host__ __device__(int val) { printf("%d ", val); @@ -43,4 +50,42 @@ int main() { ); print_vector(d_vec); } + + // Transform + { + thrust::device_vector d_vec(10); + thrust::sequence( + thrust::device, + d_vec.begin(), + d_vec.end() + ); + print_vector(d_vec); + // Now, we will add 1 to every element + thrust::transform( + thrust::device, + d_vec.begin(), + d_vec.end(), + d_vec.begin(), + plus_one_functor() + ); + print_vector(d_vec); + } + + // Merge + { + std::vector h_vec1 = {1, 2, 3, 4, 5}; + std::vector h_vec2 = {6, 7, 8, 9, 10}; + thrust::device_vector d_vec1 = h_vec1; + thrust::device_vector d_vec2 = h_vec2; + thrust::device_vector merged_vec(10); + thrust::merge( + thrust::device, + d_vec1.begin(), + d_vec1.end(), + d_vec2.begin(), + d_vec2.end(), + merged_vec.begin() + ); + print_vector(merged_vec); + } }