<div dir="ltr"><div>Hi Alexey,</div><div><br></div><div>Your reply has been a great help to me,your way of explain the different types of compilation is very detailed and easy to understand.</div><div><br></div><div>Even so, I have a couple of questions.<br></div><div><br></div><div>1) What do yourefer by OpenCL RT?</div><div><br></div><div>2) Could you give me some examples of an open-source OpenCL implementation and update optimization pipeline?</div><div><br></div><div>Thank you in advance. Regards</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">El vie., 20 sept. 2019 a las 12:34, Sachkov, Alexey (<<a href="mailto:alexey.sachkov@intel.com">alexey.sachkov@intel.com</a>>) escribió:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div lang="EN-US">
<div class="gmail-m_-9120581935815487100WordSection1">
<p class="MsoNormal">Hi Enrique,<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">> First, I only want to compile a project and execute it to see how it works, specifically this one:
<a href="https://github.com/rsnemmen/OpenCL-examples/tree/master/add_numbers" target="_blank">https://github.com/rsnemmen/OpenCL-examples/tree/master/add_numbers</a><br>
<br>
As I can see, it has a Makefile which you could use. Anyway, on Linux you need to do something like:<br>
<br>
<span style="font-family:Consolas">clang -std=c99 add_numbers.c -lOpenCL -I/path/to/folder/with/CL/cl.h</span><u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Usually, libOpenCL.so and CL/cl.h are provided by OpenCL SDKs from HW/SW vendor, for example: [1], [2], [3], [4] and others [5]<u></u><u></u></p>
<p class="MsoNormal">But, you can also get them from KhronosGroup repos: OpenCL-ICD-Loader [6], OpenCL-Headers [7]<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">> I want to do that the .c file uses the .cl that i have compiled before with clang and i do not know how to do it.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">This is an interesting question. Basically, in OpenCL you can build your device program in a separate ways:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<ol style="margin-top:0cm" start="1" type="1">
<li class="gmail-m_-9120581935815487100MsoListParagraph" style="margin-left:0cm">Use clCreateProgramFromSource + clBuildProgram: this is so-called “online” compilation, when your device code is written in OpenCL C and its compilation is performed in runtime (all
 stages like front-end, middle-end optimizations and back-end, i.e. codegen to native code)<u></u><u></u></li><li class="gmail-m_-9120581935815487100MsoListParagraph" style="margin-left:0cm">Use clCreateProgramWithBinary + clBuildProgram: this is so-called “offline” compilation, where you build your device code manually prior launching the app. Unfortunately, OpenCL spec
 doesn’t define binary format, i.e. it is implementation-defined. Usually each vendor provides so-called “offline compiler” tool which allows you to get device binary for your OpenCL code – the binary is not portable across different devices/vendors<u></u><u></u></li><li class="gmail-m_-9120581935815487100MsoListParagraph" style="margin-left:0cm">Use clCreateProgramWithIL + clBuildProgram: requires OpenCL 2.1 or cl_khr_il_program extension. Allows you to create program from SPIR-V. Basically, this is kind of combination of
 online and offline models: one the one side, you need to launch offline compiler to parse source code and get SPIR-V, on the other side, SPIR-V is an intermediate representation, i.e. partially-compiled program – that will save some runtime resources. Plus,
 SPIR-V is a standard and it is portable between devices/vendors.<u></u><u></u></li></ol>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Summarizing:<u></u><u></u></p>
<ul style="margin-top:0cm" type="disc">
<li class="gmail-m_-9120581935815487100MsoListParagraph" style="margin-left:0cm">There are several OpenCL implementations (both open-source and closed-source) which are LLVM-based<u></u><u></u></li><li class="gmail-m_-9120581935815487100MsoListParagraph" style="margin-left:0cm">Not sure that a lot of them provide possibility to create OpenCL program from pure LLVM IR produced by clang<u></u><u></u></li></ul>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">If you want to optimize your OpenCL code by yourself you can do the following:<u></u><u></u></p>
<ul style="margin-top:0cm" type="disc">
<li class="gmail-m_-9120581935815487100MsoListParagraph" style="margin-left:0cm">Try to understand binary format that is accepted by OpenCL runtime you are using: try to contact support/forums to check if you can pass already optimized LLVM BC there (BTW, not sure
 that this functionality is widely supported)<u></u><u></u></li><li class="gmail-m_-9120581935815487100MsoListParagraph" style="margin-left:0cm">Get LLVM IR from clang, then optimize it as you want, then convert it to SPIR-V and pass to OpenCL RT<u></u><u></u></li><li class="gmail-m_-9120581935815487100MsoListParagraph" style="margin-left:0cm">Find open-source OpenCL implementation and update optimization pipeline in there with you own modifications<u></u><u></u></li></ul>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Personally, I would go with the last option.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">[1]: <a href="https://software.intel.com/en-us/opencl-sdk" target="_blank">https://software.intel.com/en-us/opencl-sdk</a>
<u></u><u></u></p>
<p class="MsoNormal">[2]: <a href="https://developer.nvidia.com/opencl" target="_blank">https://developer.nvidia.com/opencl</a>
<u></u><u></u></p>
<p class="MsoNormal">[3]: <a href="https://github.com/GPUOpen-LibrariesAndSDKs/OCL-SDK/releases" target="_blank">
https://github.com/GPUOpen-LibrariesAndSDKs/OCL-SDK/releases</a><u></u><u></u></p>
<p class="MsoNormal">[4]: <a href="https://developer.arm.com/solutions/graphics/apis/opencl" target="_blank">
https://developer.arm.com/solutions/graphics/apis/opencl</a><u></u><u></u></p>
<p class="MsoNormal">[5]: <a href="https://www.iwocl.org/resources/opencl-implementations/" target="_blank">
https://www.iwocl.org/resources/opencl-implementations/</a><u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">[6]: <a href="https://github.com/KhronosGroup/OpenCL-ICD-Loader" target="_blank">
https://github.com/KhronosGroup/OpenCL-ICD-Loader</a><u></u><u></u></p>
<p class="MsoNormal">[7]: <a href="https://github.com/KhronosGroup/OpenCL-Headers" target="_blank">
https://github.com/KhronosGroup/OpenCL-Headers</a><u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><a name="m_-9120581935815487100______replyseparator"></a><b>From:</b> llvm-dev <<a href="mailto:llvm-dev-bounces@lists.llvm.org" target="_blank">llvm-dev-bounces@lists.llvm.org</a>>
<b>On Behalf Of </b>Enrique Gonzalez via llvm-dev<br>
<b>Sent:</b> Thursday, September 19, 2019 11:41 PM<br>
<b>To:</b> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<b>Subject:</b> [llvm-dev] Execute OpenCL<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Dear all,<u></u><u></u></p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">After a huge amount of time trying to install LLVM and Clang i could finally do it, so now im trying to use this tools for generating a bytecode, then apply it modular optimizations and then generate an executable to test the result. <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">First, I only want to compile a project and execute it to see how it works, specifically this one: <a href="https://github.com/rsnemmen/OpenCL-examples/tree/master/add_numbers" target="_blank">https://github.com/rsnemmen/OpenCL-examples/tree/master/add_numbers</a><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Which commands would you use?<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I want to do that the .c file uses the .cl that i have compiled before with clang and i do not know how to do it.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<p class="MsoNormal">Thanks in advance.  <u></u><u></u></p>
</div>
<p><br>--------------------------------------------------------------------<br>Joint Stock Company Intel A/O<br>Registered legal address: Krylatsky Hills Business Park, <br>17 Krylatskaya Str., Bldg 4, Moscow 121614, <br>Russian Federation</p><p>This e-mail and any attachments may contain confidential material for<br>the sole use of the intended recipient(s). Any review or distribution<br>by others is strictly prohibited. If you are not the intended<br>recipient, please contact the sender and delete all copies.</p>
</div>

</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature">Un saludo<div><br></div><div>Enrique González</div></div>