<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div><blockquote type="cite" class=""><div class="">On Mar 28, 2018, at 3:29 PM, Liu, Yaxun (Sam) via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org" class="">cfe-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">HIP is a language similar to CUDA (<a href="https://github.com/ROCm-Developer-Tools/HIP/blob/master/docs/markdown/hip_kernel_language.md" class="">https://github.com/ROCm-Developer-Tools/HIP/blob/master/docs/markdown/hip_kernel_language.md</a>  ).<br class="">The language syntax is very similar, which allows a hip program to be compiled as a CUDA program by Clang. The main difference<br class="">is the host API. HIP has a set of vendor neutral host API which can be implemented on different platforms. Currently there is open source<br class="">implementation of HIP runtime on amdgpu target (<a href="https://github.com/ROCm-Developer-Tools/HIP" class="">https://github.com/ROCm-Developer-Tools/HIP</a> ).<br class=""><br class="">We have a working implementation of HIP compiler based on clang thanks to Greg Rodgers' work and we would like to upstream it. As an initial step, we created a Phabricator<br class="">Review <a href="https://reviews.llvm.org/D44984" class="">https://reviews.llvm.org/D44984</a> for adding support of file type hip and language option HIP.<br class=""><br class="">When hip file is compiled, both LangOpts.CUDA and LangOpts.HIP is turned on. This allows compilation of hip program as CUDA<br class="">in most cases and only special handling of hip program is needed LangOpts.HIP is checked.<br class=""><br class="">This patch also adds support of kernel launching of HIP program using HIP host API.<br class=""><br class="">The next patch will be the toolchain changes to support HIP. Basically HIP has its own open source header files and device libraries which may be ported to different targets/platforms.<br class=""><br class="">We plan to continue upstreaming our support of HIP until it becomes mature enough to support major machine learning applications ported to HIP, e.g. TensorFlow <a href="https://github.com/ROCmSoftwarePlatform/tensorflow" class="">https://github.com/ROCmSoftwarePlatform/tensorflow</a> .<br class=""></div></div></blockquote></div><br class=""><div class="">Clang has a written policy about contributing new extensions, which you can find here:</div><div class="">  <a href="https://clang.llvm.org/get_involved.html" class="">https://clang.llvm.org/get_involved.html</a></div><div class=""><br class=""></div><div class="">It seems to me that that's the bar that HIP needs to meet in order to be accepted into Clang.  Would you mind running through the seven criteria listed on that page?  To make this easier, I'll go ahead and quote them:</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class="">Clang has always been designed as a platform for experimentation, allowing programmers to easily extend the compiler to support great new language features and tools. At some point, the authors of these extensions may propose that the extensions become a part of Clang itself, to benefit the whole Clang community. But not every idea--not even every great idea--should become part of Clang. Extensions (particularly language extensions) pose a long-term maintenance burden on Clang, and therefore the benefits of the extension must outweight those costs. Hence, these are the seven criteria used to evaluate the merits of a proposed extension:</div><div class=""><br class=""></div><div class=""><div class=""><span class="Apple-tab-span" style="white-space:pre">       </span>• Evidence of a significant user community: This is based on a number of factors, including an actual, existing user community, the perceived likelihood that users would adopt such a feature if it were available, and any "trickle-down" effects that come from, e.g., a library adopting the feature and providing benefits to its users.</div></div><div class=""><div class=""><br class=""></div></div><div class=""><div class=""><span class="Apple-tab-span" style="white-space:pre">    </span>• A specific need to reside within the Clang tree: There are some extensions that would be better expressed as a separate tool, and should remain as separate tools even if they end up being hosted as part of the LLVM umbrella project.</div></div><div class=""><div class=""><br class=""></div></div><div class=""><div class=""><span class="Apple-tab-span" style="white-space:pre">      </span>• A complete specification: The specification must be sufficient to understand the design of the feature as well as interpret the meaning of specific examples. The specification should be detailed enough that another compiler vendor could conceivably implement the feature.</div></div><div class=""><div class=""><br class=""></div></div><div class=""><div class=""><span class="Apple-tab-span" style="white-space:pre">       </span>• Representation within the appropriate governing organization: For extensions to a language governed by a standards committee (C, C++, OpenCL), the extension itself must have an active proposal and proponent within that committee and have a reasonable chance of acceptance. Clang should drive the standard, not diverge from it. This criterion does not apply to all extensions, since some extensions fall outside of the realm of the standards bodies.</div></div><div class=""><div class=""><br class=""></div></div><div class=""><div class=""><span class="Apple-tab-span" style="white-space:pre">    </span>• A long-term support plan: Contributing a non-trivial extension to Clang implies a commitment to supporting that extension, improving the implementation and specification as Clang evolves. The capacity of the contributor to make that commitment is as important as the commitment itself.</div></div><div class=""><div class=""><br class=""></div></div><div class=""><div class=""><span class="Apple-tab-span" style="white-space:pre">    </span>• A high-quality implementation: The implementation must fit well into Clang's architecture, follow LLVM's coding conventions, and meet Clang's quality standards, including high-quality diagnostics and rich AST representations. This is particularly important for language extensions, because users will learn how those extensions work through the behavior of the compiler.</div></div><div class=""><div class=""><br class=""></div></div><div class=""><div class=""><span class="Apple-tab-span" style="white-space:pre">       </span>• A proper test suite: Extensive testing is crucial to ensure that the language extension is not broken by ongoing maintenance in Clang. The test suite should be complete enough that another compiler vendor could conceivably validate their implementation of the feature against it.</div></div></blockquote><div class=""><br class=""></div><div class="">To get you started, I'm willing to stipulate that HIP meets a few of these criteria (although other people may disagree):</div><div class=""><br class=""></div><div class="">- It has a clear need to reside within the Clang tree because it's a variant language mode with slightly different Sema and IRGen rules.  That would be very hard to maintain as a separate project.</div><div class=""><br class=""></div><div class="">- Assuming that you are willing to gradually upstream the work instead of dumping it all in as a few massive patches, I will accept that it has a high-quality implementation that meeds our architectural and quality requirements.</div><div class=""><br class=""></div><div class="">Please address the other five points, though.</div><div class=""><br class=""></div><div class="">John.</div></body></html>