#define CUDATOOLS_IMPLEMENTATION #include #include DEFINE_KERNEL(times2, const CudaTools::Array& arr) { BASIC_LOOP(arr.shape().items()) { arr[iThread] *= 2; } } int main() { CudaTools::Array arrRange = CudaTools::Array::range(0, 10); CudaTools::Array arrConst = CudaTools::Array::constant(1); CudaTools::Array arrLinspace = CudaTools::Array::linspace(0, 5, 10); CudaTools::Array arrComma({2, 2}); // 2x2 array. arrComma << 1, 2, 3, 4; // Comma initializer if needed. std::cout << arrRange << "\n" << arrConst << "\n" << arrLinspace << "\n" << arrComma "\n"; // Call the kernel multiple times asynchronously. Note: since they share same // stream, they are not run in parallel, just queued on the device. KERNEL(times2, CudaTools::Kernel::basic(arrRange.shape().items()), arrRange); KERNEL(times2, CudaTools::Kernel::basic(arrConst.shape().items()), arrRange); KERNEL(times2, CudaTools::Kernel::basic(arrLinspace.shape().items()), arrRange).wait(); KERNEL(times2, CudaTools::Kernel::basic(arrComma.shape().items()), arrRange).wait(); arrRange.updateHost(); arrConst.updateHost(); arrLinspace.updateHost(); arrComma.updateHost().wait(); // Only need to wait for the last one, since they have the same stream. std::cout << arrRange << "\n" << arrConst << "\n" << arrLinspace << "\n" << arrComma "\n"; return 0; }