[Beignet] [PATCH] Add the PCH support when building the source.

He Junyan junyan.he at inbox.com
Mon Jul 15 20:30:17 PDT 2013


I think this way maybe OK:
We generate the PCH file under beignet's folder when make and install 
the PCH file to /tmp/
when use make install cmd.


On 07/16/2013 11:27 AM, Zou, Nanhai wrote:
> Hi,
> 	The patch really speed up the compiling.
> 	My suggestion is,
> 	1. Move ocl_header.h and ocl_header.h.pch into beignet folder
> 	2. Put the pch generation logic into cmake so that the build system can check dependency on ocl_header.h and the pch.
>
> Thanks
> Zou Nanhai
> -----Original Message-----
> From: beignet-bounces+nanhai.zou=intel.com at lists.freedesktop.org [mailto:beignet-bounces+nanhai.zou=intel.com at lists.freedesktop.org] On Behalf Of junyan.he at inbox.com
> Sent: Monday, July 15, 2013 6:23 PM
> To: beignet at lists.freedesktop.org
> Cc: Junyan He
> Subject: [Beignet] [PATCH] Add the PCH support when building the source.
>
> From: Junyan He <junyan.he at linux.intel.com>
>
> Because the utest grows bigger, the runtime compiling time seems a big problem to cause the utest_run very slow.
> Most of the time wastes on re-parsing the big header file such as ocl_stdlib.h.
> Using the PCH feature of Clang can shorten the compiling time a lot.
> One shortcut: the PCH file in the /tmp/ will not be updated automaticly when you modify the ocl_stdlib.h. You should remove the pch file manually.
>
> Signed-off-by: Junyan He <junyan.he at linux.intel.com>
> ---
>   backend/src/backend/program.cpp |   54 +++++++++++++++++++++++++++++++++++----
>   1 file changed, 49 insertions(+), 5 deletions(-)
>
> diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp index 2a4feb9..8f1cf61 100644
> --- a/backend/src/backend/program.cpp
> +++ b/backend/src/backend/program.cpp
> @@ -229,18 +229,62 @@ namespace gbe {
>                                             size_t *errSize)
>     {
>       char clStr[L_tmpnam+1], llStr[L_tmpnam+1];
> +    std::string clOpt;
> +    const std::string header = "/tmp/ocl_header.h";
> +    const std::string header_pch = "/tmp/ocl_header.h.pch";
>       const std::string clName = std::string(tmpnam_r(clStr)) + ".cl"; /* unsafe! */
>       const std::string llName = std::string(tmpnam_r(llStr)) + ".ll"; /* unsafe! */
> -
> -    // Write the source to the cl file
> +    FILE *clHeader = NULL;
>       FILE *clFile = fopen(clName.c_str(), "w");
>       FATAL_IF(clFile == NULL, "Failed to open temporary file");
> -    fwrite(ocl_common_defines_str.c_str(), strlen(ocl_common_defines_str.c_str()), 1, clFile);
> -    fwrite(ocl_stdlib_str.c_str(), strlen(ocl_stdlib_str.c_str()), 1, clFile);
> +
> +    /* Use the header_pch to save the tokenized file. */
> +    if (::access(header_pch.c_str(), R_OK)) {
> +      std::string cmd;
> +      clHeader = fopen(header.c_str(), "w");
> +      FATAL_IF(clHeader == NULL, "Failed to open header file");
> +
> +      fwrite(ocl_common_defines_str.c_str(), strlen(ocl_common_defines_str.c_str()), 1, clHeader);
> +      fwrite(ocl_stdlib_str.c_str(), strlen(ocl_stdlib_str.c_str()), 1, clHeader);
> +      fclose(clHeader);
> +
> +      cmd += "clang -cc1 ";
> +      cmd += "-emit-pch ";
> +      cmd += header;
> +      cmd += " ";
> +      cmd += "-x ";
> +      cmd +=" cl ";
> +
> +#if LLVM_VERSION_MINOR <= 2
> +      cmd +="-triple ";
> +      cmd +="nvptx ";
> +#else
> +      cmd +="-triple ";
> +      cmd +="spir ";
> +#endif /* LLVM_VERSION_MINOR <= 2 */
> +
> +#if LLVM_VERSION_MINOR <= 1
> +      cmd +="-triple ";
> +      cmd +="ptx32 ";
> +#else
> +      cmd += "-ffp-contract=off ";
> +#endif /* LLVM_VERSION_MINOR <= 1 */
> +      cmd += "-o ";
> +      cmd += header_pch;
> +      ::system(cmd.c_str());
> +    }
> +
> +    // Write the source to the cl file
>       fwrite(source, strlen(source), 1, clFile);
>       fclose(clFile);
>   
> -    buildModuleFromSource(clName.c_str(), llName.c_str(), options ? options : "");
> +    clOpt += "-include-pch";
> +    clOpt += " ";
> +    clOpt += header_pch;
> +    clOpt += " ";
> +    if(options)
> +      clOpt += options;
> +    buildModuleFromSource(clName.c_str(), llName.c_str(),
> + clOpt.c_str());
>       remove(clName.c_str());
>   
>       // Now build the program from llvm
> --
> 1.7.9.5
>
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet





More information about the Beignet mailing list