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

He Junyan junyan.he at inbox.com
Mon Jul 15 20:19:55 PDT 2013


On 07/16/2013 10:54 AM, Zhigang Gong wrote:
> This patch really accelerate the compiling speed dramaticlly. Thanks.
>
> One comment as below:
>
> On Mon, Jul 15, 2013 at 06:22:37PM +0800, junyan.he at inbox.com wrote:
>> 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.
> I think this is not convenient for developers and may bring some
> confusing. I have two ideas to mitigate or solve this problem:
>
> 1. precompile the header file at the gbe's build time. Then we will get an up-to-date
> pch file embedded in the gbe library.
Do you mean generate the pch file when make ?
>
> 2. compute a hash value of the ocl_header.h at gbe's build time, and store this hash
> value into the pch file (not very sure whether pch file format can contain any comments
> like data, but at least we still can save this hash value to ocl_header.h.hash file at
> the same location of the ocl_header.h.pch). At the gbe runtime, we just need to compare
> current hash value with the one in the pch file to determine whether we need to update
> a new pch file.
>
> The first solution is the ideal solution. And the second is also not too bad, as
> we only compute the hash value at gbe's build time and it doesn't bring any overhead
> to the application for the hash value computing.
>
> Any thoughts?
>
>> 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