Andrew Savonichev, 2019 European LLVM Developers Meeting
Transcript of Andrew Savonichev, 2019 European LLVM Developers Meeting
![Page 1: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/1.jpg)
zero-cost abstraction and type safety for heterogeneous computing
Andrew Savonichev, 2019 European LLVM Developers Meeting
![Page 2: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/2.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice2
Agenda
• What is SYCL?
• “Hello, world!” in SYCL
• Scheduler
• Single source
• Compilation flow
• SPIR-V
• Integration header
• Upstream plan
![Page 3: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/3.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice
Legal Disclaimer & Optimization Notice
Optimization Notice
Intel’s compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not unique to Intel microprocessors. These optimizations include SSE2, SSE3, and SSSE3 instruction sets and other optimizations. Intel does not guarantee the availability, functionality, or effectiveness of any optimization on microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended for use with Intel microprocessors. Certain optimizations not specific to Intel microarchitecture are reserved for Intel microprocessors. Please refer to the applicable product User and Reference Guides for more information regarding the specific instruction sets covered by this notice.
Notice revision #20110804
3
Software and workloads used in performance tests may have been optimized for performance only on Intel microprocessors. Performance tests, such as SYSmark and MobileMark, are measured using specific computer systems, components, software, operations and functions. Any change to any of those factors may cause the results to vary. You should consult other information and performance tests to assist you in fully evaluating your contemplated purchases, including the performance of that product when combined with other products. For more complete information visit www.intel.com/benchmarks.
INFORMATION IN THIS DOCUMENT IS PROVIDED “AS IS”. NO LICENSE, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, TO ANY INTELLECTUAL PROPERTY RIGHTS IS GRANTED BY THIS DOCUMENT. INTEL ASSUMES NO LIABILITY WHATSOEVER AND INTEL DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY, RELATING TO THIS INFORMATION INCLUDING LIABILITY OR WARRANTIES RELATING TO FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR INFRINGEMENT OF ANY PATENT, COPYRIGHT OR OTHER INTELLECTUAL PROPERTY RIGHT.
Copyright © 2019, Intel Corporation. All rights reserved. Intel, the Intel logo, Pentium, Xeon, Core, VTune, OpenVINO, Cilk, are trademarks of Intel Corporation or its subsidiaries in the U.S. and other countries.
![Page 4: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/4.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice4
What is SYCL?
SYCL is a cross platform abstraction layer for heterogeneous compute developed by Khronos Group.
It allows code for heterogeneous processors (CPU, GPU, FPGA, etc.) to be written in a “single-source” style using standard C++11.
https://www.khronos.org/sycl/
![Page 5: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/5.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice5
“Hello, world!”template <typename T>
void vector_add(const std::vector<T>& A, const std::vector<T>& B, std::vector<T>& C) {
}
![Page 6: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/6.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice6
“Hello, world!”template <typename T>
void vector_add(const std::vector<T>& A, const std::vector<T>& B, std::vector<T>& C) {
cl::sycl::buffer<T, 1> bufferA(A.data(), A.size());
cl::sycl::buffer<T, 1> bufferB(B.data(), B.size());
cl::sycl::buffer<T, 1> bufferC(C.data(), C.size());
}
Step 1: create buffers(represent both host and device memory)
![Page 7: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/7.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice7
“Hello, world!”template <typename T>
void vector_add(const std::vector<T>& A, const std::vector<T>& B, std::vector<T>& C) {
cl::sycl::buffer<T, 1> bufferA(A.data(), A.size());
cl::sycl::buffer<T, 1> bufferB(B.data(), B.size());
cl::sycl::buffer<T, 1> bufferC(C.data(), C.size());
cl::sycl::queue deviceQueue;
}
Step 2: create a queue on a default device(you can optionally specify a device type)
![Page 8: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/8.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice8
“Hello, world!”template <typename T>
void vector_add(const std::vector<T>& A, const std::vector<T>& B, std::vector<T>& C) {
cl::sycl::buffer<T, 1> bufferA(A.data(), A.size());
cl::sycl::buffer<T, 1> bufferB(B.data(), B.size());
cl::sycl::buffer<T, 1> bufferC(C.data(), C.size());
cl::sycl::queue deviceQueue;
deviceQueue.submit([&](cl::sycl::handler& cgh) {
...
});
}
Step 3: submit an operation for(asynchronous) execution
![Page 9: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/9.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice9
“Hello, world!”template <typename T>
void vector_add(const std::vector<T>& A, const std::vector<T>& B, std::vector<T>& C) {
cl::sycl::buffer<T, 1> bufferA(A.data(), A.size());
cl::sycl::buffer<T, 1> bufferB(B.data(), B.size());
cl::sycl::buffer<T, 1> bufferC(C.data(), C.size());
cl::sycl::queue deviceQueue;
deviceQueue.submit([&](cl::sycl::handler& cgh) {
auto accessorA = bufferA.get_access<sycl_read>(cgh);
auto accessorB = bufferB.get_access<sycl_read>(cgh);
auto accessorC = bufferC.get_access<sycl_write>(cgh);
});
}
Step 4: create buffer accessors: representa buffer + an access type
![Page 10: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/10.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice10
“Hello, world!”template <typename T>
void vector_add(const std::vector<T>& A, const std::vector<T>& B, std::vector<T>& C) {
cl::sycl::buffer<T, 1> bufferA(A.data(), A.size());
cl::sycl::buffer<T, 1> bufferB(B.data(), B.size());
cl::sycl::buffer<T, 1> bufferC(C.data(), C.size());
cl::sycl::queue deviceQueue;
deviceQueue.submit([&](cl::sycl::handler& cgh) {
auto accessorA = bufferA.get_access<sycl_read>(cgh);
auto accessorB = bufferB.get_access<sycl_read>(cgh);
auto accessorC = bufferC.get_access<sycl_write>(cgh);
cgh.parallel_for<class vec_add>(cl::sycl::range<1>(A.size()),
[=](cl::sycl::id<1> wiID) {
...
});
});
}
Step 6: create a kernelwith name and NDRangedimensions
![Page 11: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/11.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice11
“Hello, world!”template <typename T>
void vector_add(const std::vector<T>& A, const std::vector<T>& B, std::vector<T>& C) {
cl::sycl::buffer<T, 1> bufferA(A.data(), A.size());
cl::sycl::buffer<T, 1> bufferB(B.data(), B.size());
cl::sycl::buffer<T, 1> bufferC(C.data(), C.size());
cl::sycl::queue deviceQueue;
deviceQueue.submit([&](cl::sycl::handler& cgh) {
auto accessorA = bufferA.get_access<sycl_read>(cgh);
auto accessorB = bufferB.get_access<sycl_read>(cgh);
auto accessorC = bufferC.get_access<sycl_write>(cgh);
cgh.parallel_for<class vec_add>(cl::sycl::range<1>(A.size()),
[=](cl::sycl::id<1> wiID) {
accessorC[wiID] = accessorA[wiID] + accessorB[wiID];
});
});
}
Step 7: write a kernel
![Page 12: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/12.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice12
“Hello, world!”template <typename T>
void vector_add(const std::vector<T>& A, const std::vector<T>& B, std::vector<T>& C) {
cl::sycl::buffer<T, 1> bufferA(A.data(), A.size());
cl::sycl::buffer<T, 1> bufferB(B.data(), B.size());
cl::sycl::buffer<T, 1> bufferC(C.data(), C.size());
cl::sycl::queue deviceQueue;
deviceQueue.submit([&](cl::sycl::handler& cgh) {
auto accessorA = bufferA.get_access<sycl_read>(cgh);
auto accessorB = bufferB.get_access<sycl_read>(cgh);
auto accessorC = bufferC.get_access<sycl_write>(cgh);
cgh.parallel_for<class vec_add>(cl::sycl::range<1>(A.size()),
[=](cl::sycl::id<1> wiID) {
accessorC[wiID] = accessorA[wiID] + accessorB[wiID];
});
});
}
That’s it! Buffer C will be memcpy’ed back to a hostwhen bufferC goes out of scope.
![Page 13: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/13.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice13
![Page 14: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/14.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice14
SchedulerdeviceQueue.submit([&](cl::sycl::handler& cgh) {
auto accessorA = bufferA.get_access<sycl_read>(cgh);auto accessorB = bufferB.get_access<sycl_read>(cgh);auto accessorC = bufferC.get_access<sycl_write>(cgh);
cgh.parallel_for<class kernel_1>(cl::sycl::range<1>(A.size()), [=](cl::sycl::id<1> wiID) {
accessorC[wiID] = accessorA[wiID] + accessorB[wiID];});
});
Kernel #1
BA
C
![Page 15: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/15.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice15
SchedulerdeviceQueue.submit([&](cl::sycl::handler& cgh) {
auto accessorA = bufferA.get_access<sycl_read>(cgh);auto accessorB = bufferB.get_access<sycl_read>(cgh);auto accessorC = bufferC.get_access<sycl_write>(cgh);
cgh.parallel_for<class kernel_1>(cl::sycl::range<1>(A.size()), [=](cl::sycl::id<1> wiID) {
accessorC[wiID] = accessorA[wiID] + accessorB[wiID];});
});
deviceQueue.submit([&](cl::sycl::handler& cgh) {auto accessorС = bufferC.get_access<sycl_read>(cgh);auto accessorD = bufferD.get_access<sycl_read>(cgh);auto accessorE = bufferE.get_access<sycl_write>(cgh);
cgh.parallel_for<class vec_add>(cl::sycl::range<1>(C.size()),[=](cl::sycl::id<1> wiID) {
accessorE[wiID] = accessorC[wiID] + accessorD[wiID];});
});
Kernel #1
BA
C
Kernel #2
D
![Page 16: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/16.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice16
SchedulerdeviceQueue.submit([&](cl::sycl::handler& cgh) {
auto accessorA = bufferA.get_access<sycl_read>(cgh);auto accessorB = bufferB.get_access<sycl_read>(cgh);auto accessorC = bufferC.get_access<sycl_write>(cgh);
cgh.parallel_for<class kernel_1>(cl::sycl::range<1>(A.size()), [=](cl::sycl::id<1> wiID) {
accessorC[wiID] = accessorA[wiID] + accessorB[wiID];});
});
deviceQueue.submit([&](cl::sycl::handler& cgh) {auto accessorС = bufferC.get_access<sycl_read>(cgh);auto accessorD = bufferD.get_access<sycl_read>(cgh);auto accessorE = bufferE.get_access<sycl_write>(cgh);
cgh.parallel_for<class vec_add>(cl::sycl::range<1>(C.size()),[=](cl::sycl::id<1> wiID) {
accessorE[wiID] = accessorC[wiID] + accessorD[wiID];});
});
Kernel #1
BA
C
Kernel #2
D
No explicit “wait” operation!SYCL runtime is responsible for synchronization.
![Page 17: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/17.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice17
![Page 18: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/18.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice18
Single source - single type system
OpenCL code:
kernel.cl:
struct point {char x;char y;
};
kernel foo(point *p) {assert(p->x == 0 &&
p->y == 1);}
host.cpp:
struct point {char x;char y;
};
point p = {0, 1};clSetKernelArg(kern, p);clEnqueueKernel(kern);
![Page 19: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/19.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice19
Single source - single type system
OpenCL code:
kernel.cl:
struct point {char x;char y;
};
kernel foo(point *p) {assert(p->x == 0 &&
p->y == 1);}
host.cpp:
struct point {char x;char y;
};
point p = {0, 1};clSetKernelArg(kern, p);clEnqueueKernel(kern);
Structs may have different layout!
![Page 20: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/20.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice20
Single source - single type system
SYCL code:
host_and_device.cpp:
struct point {char x;char y;
};
point p = {0, 1};
deviceQueue.submit([&](cl::sycl::handler& cgh) {
cgh.parallel_for<class kern>(cl::sycl::range<1>(1),[=](cl::sycl::id<1> wiID) {
assert(p.x == 0 && p.y == 1);});
});
![Page 21: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/21.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice21
Single source - single type system
SYCL code:
host_and_device.cpp:
struct point {char x;char y;
};
point p = {0, 1};
deviceQueue.submit([&](cl::sycl::handler& cgh) {
cgh.parallel_for<class kern>(cl::sycl::range<1>(1),[=](cl::sycl::id<1> wiID) {
assert(p.x == 0 && p.y == 1);});
});
Same layout is guaranteed by the SYCL compiler
![Page 22: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/22.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice26
![Page 23: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/23.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice27
Standard C++ flow
a.cpp
a.o
a.out
clang -c
ld
![Page 24: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/24.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice28
Standard C++ flow
a.cpp
a.o
a.out
clang -c -fsycl
ld -lsycl
Enable SYCL compilerfeatures
Link with SYCL Runtime
![Page 25: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/25.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice29
SYCL flow (under the hood) *
* simplified
a.cppclang -fsycl-device clang -fsycl
a.device.ll
a.device.bin
< device compiler >
a.host.ll
a.host.o
ld -lsycl
a.o
clangoffload
wrapper
a.out
Device compilation
Hostcompilation
![Page 26: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/26.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice30
SPIR-V support
SPIR-V is a device-agnostic IR originally created for OpenCL and Vulkan.
It allows to run a single SYCL executableOn any device that supports SPIR-V.
SPIR-V Translator from LLVM IR to SPIR-Vis developed on Github:https://github.com/KhronosGroup/SPIRV-LLVM-Translator
SYCL executable
SPIR-V bin
CPU GPUOther devices with SPIR-V
support
![Page 27: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/27.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice31
SYCL flow: integration header
cgh.parallel_for<class kernel_1>(cl::sycl::range<1>(8), [=](cl::sycl::id<1> wiID) {
accessorC[wiID] = accessorA[wiID] + accessorB[wiID];});
Step 1: device compilerextracts the lambda function.
Class name kernel_1 is a device kernel name.
![Page 28: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/28.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice32
SYCL flow: integration header
cgh.parallel_for<class kernel_1>(cl::sycl::range<1>(8), [=](cl::sycl::id<1> wiID) {
accessorC[wiID] = accessorA[wiID] + accessorB[wiID];});
Step 1: device compilerextracts the lambda function.
Class name kernel_1 is a device kernel name.
a.device.bin:
__kernel kernel_1(T* buf) {...
}
![Page 29: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/29.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice33
SYCL flow: integration header
cgh.parallel_for<class kernel_1>(cl::sycl::range<1>(8), [=](cl::sycl::id<1> wiID) {
accessorC[wiID] = accessorA[wiID] + accessorB[wiID];});
Step 2: Host code mustcall the device function by name, and provide therequired parameters.
a.device.bin:
__kernel kernel_1(T* buf) {...
}
a.host.cpp:
clCreateKernel(“kernel name”);clSetKernelArg(0, buf);
![Page 30: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/30.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice34
SYCL flow: integration header
cgh.parallel_for<class kernel_1>(cl::sycl::range<1>(8), [=](cl::sycl::id<1> wiID) {
accessorC[wiID] = accessorA[wiID] + accessorB[wiID];});
a.device.bin:
__kernel kernel_1(T* buf) {...
}
a.host.cpp:
clCreateKernel(“kernel name”);clSetKernelArg(0, buf);
No way to map a type name (kernel_1) to a string!
![Page 31: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/31.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice35
SYCL flow: integration header
cgh.parallel_for<class kernel_1>(cl::sycl::range<1>(8), [=](cl::sycl::id<1> wiID) {
accessorC[wiID] = accessorA[wiID] + accessorB[wiID];});
a.device.bin:
__kernel kernel_1(T* buf) {...
}
a.host.cpp:
clCreateKernel(“kernel name”);clSetKernelArg(0, buf);
No way to determine an order ofarguments captured by a lambda
![Page 32: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/32.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice36
SYCL flow: integration header
cgh.parallel_for<class kernel_1>(cl::sycl::range<1>(8), [=](cl::sycl::id<1> wiID) {
accessorC[wiID] = accessorA[wiID] + accessorB[wiID];});
a.device.bin:
__kernel kernel_1(T* buf) {...
}
a.host.cpp:
clCreateKernel(KernelDesk<T>::getName());
...
a.int.h:
template<>class KernelDesc<kernel_1> {const char* getName();unsigned getArgNum();ArgDesc getArg(unsigned);
};
![Page 33: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/33.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice37
SYCL standard library
SYCL standard library implementation consists of 28 public headers, and ~30 implementation (detail) headers:
• include/CL/sycl/accessor.hpp
• include/CL/sycl/buffer.hpp
• include/CL/sycl/device.hpp
• include/CL/sycl/kernel.hpp
• etc.
![Page 34: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/34.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice38
SYCL upstream to LLVM.org
• Intel/llvm repository is a staging area to design concepts and prototype solutions
• Contribution to llvm.org is our primary goal
• RFC: https://lists.llvm.org/pipermail/cfe-dev/2019-January/060811.html
• First changes to the clang driver are already committed: https://reviews.llvm.org/D57768
• Detailed plan for upstream: https://github.com/intel/llvm/issues/49
• SYCL source code: https://github.com/intel/llvm/tree/sycl
![Page 35: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/35.jpg)
Copyright © 2019, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.
Optimization Notice39
Call to action
Please provide inputs to design and implementation
Welcome to contribute ideas/implementation to our sandbox or join us on the path to llvm.org
![Page 36: Andrew Savonichev, 2019 European LLVM Developers Meeting](https://reader033.fdocuments.in/reader033/viewer/2022051922/62855ae9bf5fe27e562f6368/html5/thumbnails/36.jpg)