ตัวอย่าง | ก็อดโบลต์ | เอกสารประกอบ |
---|
Thrust คือไลบรารีอัลกอริทึมแบบขนานของ C++ ซึ่งเป็นแรงบันดาลใจให้เกิดการนำอัลกอริทึมแบบขนานมาใช้กับไลบรารีมาตรฐาน C++ อินเทอร์เฟซ ระดับสูง ของ Thrust ช่วยเพิ่ม ประสิทธิภาพการทำงาน ของโปรแกรมเมอร์ได้อย่างมาก ในขณะเดียวกันก็ทำให้สามารถพกพาประสิทธิภาพระหว่าง GPU และ CPU แบบมัลติคอร์ได้อย่างมาก สร้างบนเฟรมเวิร์กการเขียนโปรแกรมแบบขนานที่กำหนดไว้ (เช่น CUDA, TBB และ OpenMP) นอกจากนี้ยังมีสิ่งอำนวยความสะดวกทั่วไปจำนวนหนึ่งคล้ายกับที่พบในไลบรารีมาตรฐาน C++
NVIDIA C++ Standard Library เป็นโครงการโอเพ่นซอร์ส มีอยู่ใน GitHub และรวมอยู่ใน NVIDIA HPC SDK และ CUDA Toolkit หากคุณได้ติดตั้ง SDK ตัวใดตัวหนึ่งแล้ว ก็ไม่จำเป็นต้องมีการติดตั้งเพิ่มเติมหรือแฟล็กคอมไพเลอร์เพื่อใช้ libcu++
แรงขับจะเรียนรู้ได้ดีที่สุดผ่านตัวอย่าง
ตัวอย่างต่อไปนี้จะสร้างตัวเลขสุ่มตามลำดับ จากนั้นจึงถ่ายโอนไปยังอุปกรณ์แบบขนานที่มีการจัดเรียงตัวเลข
# include < thrust/host_vector.h >
# include < thrust/device_vector.h >
# include < thrust/generate.h >
# include < thrust/sort.h >
# include < thrust/copy.h >
# include < thrust/random.h >
int main () {
// Generate 32M random numbers serially.
thrust::default_random_engine rng ( 1337 );
thrust::uniform_int_distribution< int > dist;
thrust::host_vector< int > h_vec ( 32 << 20 );
thrust::generate (h_vec. begin (), h_vec. end (), [&] { return dist (rng); });
// Transfer data to the device.
thrust::device_vector< int > d_vec = h_vec;
// Sort data on the device.
thrust::sort (d_vec. begin (), d_vec. end ());
// Transfer data back to host.
thrust::copy (d_vec. begin (), d_vec. end (), h_vec. begin ());
}
ดูได้ที่ Godbolt
ตัวอย่างนี้สาธิตการคำนวณผลรวมของตัวเลขสุ่มบางตัวแบบขนาน:
# include < thrust/host_vector.h >
# include < thrust/device_vector.h >
# include < thrust/generate.h >
# include < thrust/reduce.h >
# include < thrust/functional.h >
# include < thrust/random.h >
int main () {
// Generate random data serially.
thrust::default_random_engine rng ( 1337 );
thrust::uniform_real_distribution< double > dist (- 50.0 , 50.0 );
thrust::host_vector< double > h_vec ( 32 << 20 );
thrust::generate (h_vec. begin (), h_vec. end (), [&] { return dist (rng); });
// Transfer to device and compute the sum.
thrust::device_vector< double > d_vec = h_vec;
double x = thrust::reduce (d_vec. begin (), d_vec. end (), 0 , thrust::plus< int >());
}
ดูได้ที่ Godbolt
ตัวอย่างนี้แสดงวิธีการลดแบบอะซิงโครนัส:
# include < thrust/host_vector.h >
# include < thrust/device_vector.h >
# include < thrust/generate.h >
# include < thrust/async/copy.h >
# include < thrust/async/reduce.h >
# include < thrust/functional.h >
# include < thrust/random.h >
# include < numeric >
int main () {
// Generate 32M random numbers serially.
thrust::default_random_engine rng ( 123456 );
thrust::uniform_real_distribution< double > dist (- 50.0 , 50.0 );
thrust::host_vector< double > h_vec ( 32 << 20 );
thrust::generate (h_vec. begin (), h_vec. end (), [&] { return dist (rng); });
// Asynchronously transfer to the device.
thrust::device_vector< double > d_vec (h_vec. size ());
thrust::device_event e = thrust::async::copy (h_vec. begin (), h_vec. end (),
d_vec. begin ());
// After the transfer completes, asynchronously compute the sum on the device.
thrust::device_future< double > f0 = thrust::async::reduce (thrust::device. after (e),
d_vec. begin (), d_vec. end (),
0.0 , thrust::plus< double >());
// While the sum is being computed on the device, compute the sum serially on
// the host.
double f1 = std::accumulate (h_vec. begin (), h_vec. end (), 0.0 , thrust::plus< double >());
}
ดูได้ที่ Godbolt
Thrust เป็นไลบรารีส่วนหัวเท่านั้น ไม่จำเป็นต้องสร้างหรือติดตั้งโปรเจ็กต์ เว้นแต่คุณต้องการรันการทดสอบหน่วย Thrust
ชุดเครื่องมือ CUDA ให้ซอร์สโค้ด Thrust รุ่นล่าสุดใน include/thrust
สิ่งนี้จะเหมาะสำหรับผู้ใช้ส่วนใหญ่
ผู้ใช้ที่ต้องการสนับสนุน Thrust หรือลองใช้คุณสมบัติใหม่ๆ ควรโคลนพื้นที่เก็บข้อมูล Thrust Github ซ้ำๆ:
git clone --recursive https://github.com/NVIDIA/thrust.git
สำหรับโปรเจ็กต์ที่ใช้ CMake เราจัดเตรียมแพ็คเกจ CMake เพื่อใช้กับ find_package
ดู CMake README สำหรับข้อมูลเพิ่มเติม คุณสามารถเพิ่ม Thrust ผ่าน add_subdirectory
หรือเครื่องมือ เช่น CMake Package Manager
สำหรับโปรเจ็กต์ที่ไม่ใช่ CMake ให้คอมไพล์ด้วย:
-I<thrust repo root>
)-I<thrust repo root>/dependencies/libcudacxx/
)-I<thrust repo root>/dependencies/cub/
)-DTHRUST_HOST_SYSTEM=THRUST_HOST_SYSTEM_XXX
โดยที่ XXX
คือ CPP
(อนุกรม ค่าเริ่มต้น), OMP
(OpenMP) หรือ TBB
(Intel TBB)-DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_XXX
โดยที่ XXX
คือ CPP
, OMP
, TBB
หรือ CUDA
(ค่าเริ่มต้น) Thrust ใช้ระบบการสร้าง CMake เพื่อสร้างการทดสอบหน่วย ตัวอย่าง และการทดสอบส่วนหัว หากต้องการสร้าง Thrust ในฐานะนักพัฒนา ขอแนะนำให้คุณใช้ระบบการพัฒนาแบบคอนเทนเนอร์ของเรา:
# Clone Thrust and CUB repos recursively:
git clone --recursive https://github.com/NVIDIA/thrust.git
cd thrust
# Build and run tests and examples:
ci/local/build.bash
นั่นจะเทียบเท่ากับสิ่งต่อไปนี้ แต่ในสภาพแวดล้อมแบบคอนเทนเนอร์ที่ปลอดภัยซึ่งมีการติดตั้งการอ้างอิงทั้งหมด:
# Clone Thrust and CUB repos recursively:
git clone --recursive https://github.com/NVIDIA/thrust.git
cd thrust
# Create build directory:
mkdir build
cd build
# Configure -- use one of the following:
cmake .. # Command line interface.
ccmake .. # ncurses GUI (Linux only).
cmake-gui # Graphical UI, set source/build directories in the app.
# Build:
cmake --build . -j ${NUM_JOBS} # Invokes make (or ninja, etc).
# Run tests and examples:
ctest
ตามค่าเริ่มต้น ระบบโฮสต์ CPP
แบบอนุกรม, ระบบอุปกรณ์เร่งความเร็ว CUDA
และมาตรฐาน C++14 จะถูกใช้งาน สิ่งนี้สามารถเปลี่ยนแปลงได้ใน CMake และผ่านแฟล็กไปที่ ci/local/build.bash
ข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่าบิลด์ Thrust และการสร้างคำขอดึงสามารถดูได้ในส่วนการสนับสนุน
Thrust เป็นโครงการโอเพ่นซอร์สที่พัฒนาบน GitHub Thrust ได้รับการเผยแพร่ภายใต้ Apache License v2.0 พร้อมข้อยกเว้น LLVM บางส่วนเผยแพร่ภายใต้ Apache License v2.0 และ Boost License v1.0