| [ Web Proxy ] |
| Viewing: https://raw.githubusercontent.com/PentaBug/taskflow/master/docs/ForEachCUDA.html | [Back] [Original] |
tf::cudaFlow provides two template methods, tf::cudaFlow::for_each and tf::cudaFlow::for_each_index, for creating tasks to perform parallel iterations over a range of items.
You need to include the header file, taskflow/cuda/algorithm/for_each.hpp, for creating a parallel-iteration task.
#include <taskflow/cuda/algorithm/for_each.hpp>
Index-based parallel-for performs parallel iterations over a range [first, last) with the given step size. The task created by tf::cudaFlow::for_each_index(I first, I last, I step, C callable) represents a kernel of parallel execution for the following loop:
// positive step: first, first+step, first+2*step, ... for(auto i=first; i<last; i+=step) { callable(i); } // negative step: first, first-step, first-2*step, ... for(auto i=first; i>last; i+=step) { callable(i); }
Each iteration i is independent of each other and is assigned one kernel thread to run the callable. Since the callable runs on GPU, it must be declared with a __device__ specifier. The following example creates a kernel that assigns each entry of gpu_data to 1 over the range [0, 100) with step size 1.
// assigns each element in gpu_data to 1 over the range [0, 100) with step size 1 cudaflow.for_each_index(0, 100, 1, [gpu_data] __device__ (int idx) { gpu_data[idx] = 1; });
Iterator-based parallel-for performs parallel iterations over a range specified by two STL-styled iterators, first and last. The task created by tf::cudaFlow::for_each(I first, I last, C callable) represents a parallel execution of the following loop:
for(auto i=first; i<last; i++) { callable(*i); }
The two iterators, first and last, are typically two raw pointers to the first element and the next to the last element in the range in GPU memory space. The following example creates a for_each kernel that assigns each element in gpu_data to 1 over the range [gpu_data, gpu_data + 1000).
// assigns each element to 1 over the range [gpu_data, gpu_data + 1000) cudaflow.for_each(gpu_data, gpu_data + 1000, [] __device__ (int& item) { item = 1; });
Each iteration is independent of each other and is assigned one kernel thread to run the callable. Since the callable runs on GPU, it must be declared with a __device__ specifier.
The parallel-iteration algorithms are also available in tf::cudaFlowCapturer::for_each and tf::cudaFlowCapturer::for_each_index.
Search for symbols, directories, files, pages or
modules. You can omit any prefix from the symbol or file path; adding a
: or / suffix lists all members of given symbol or
directory.
Use ↓ / ↑ to navigate through the list, Enter to go. Tab autocompletes common prefix, you can copy a link to the result using L while M produces a Markdown link.
Taskflow handbook is part of the Taskflow project, copyright Dr. Tsung-Wei Huang, 2018–2023.
Generated by Doxygen 1.9.1 and m.css.
| Web Proxy Viewer | New URL | Original Page |