From patchwork Tue Jul 4 10:18:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom de Vries X-Patchwork-Id: 783855 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3x20NS2CzQz9s65 for ; Tue, 4 Jul 2017 20:19:20 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="ATHvtbMZ"; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :subject:from:to:cc:references:message-id:date:mime-version :in-reply-to:content-type; q=dns; s=default; b=UdvAoR55iWT4Ps71V qhVozG7kWJauUx/VvS+rteGrM1F5zsPKEXC3zXOl6mrRLHwr8OKywOJmilMfPics MpXMXAoZLWaPI7FrNAlA8n0qPFfYlOC4jBjk6HpYiU2FlW+/UecH9WwS66kL+w6N 7DpzhEmrqtgC/reSATs37AgSnY= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :subject:from:to:cc:references:message-id:date:mime-version :in-reply-to:content-type; s=default; bh=o1fQTcm0vcgB4A0qBz0O9we TTxM=; b=ATHvtbMZDG0gX4NaBYzkr40It0aqgSW+g39xUPXdKFVgp3TAAU70KvA vXT3nmc84upxjY0ooQDTRLW5RoxaGTUEWFLLMxD0n7fqHlyrq/6k2MTRKmCN5TW7 Ub1pGw9MRerBDdAzOXooVFCkW3B3KTdKHcuRjxuQ4Ypw/2i8X/HQ= Received: (qmail 93051 invoked by alias); 4 Jul 2017 10:19:11 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 93033 invoked by uid 89); 4 Jul 2017 10:19:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.6 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS, URIBL_RED autolearn=ham version=3.3.2 spammy= X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 04 Jul 2017 10:19:08 +0000 Received: from nat-ies.mentorg.com ([192.94.31.2] helo=SVR-IES-MBX-04.mgc.mentorg.com) by relay1.mentorg.com with esmtp id 1dSKvD-0002o2-1p from Tom_deVries@mentor.com ; Tue, 04 Jul 2017 03:19:07 -0700 Received: from [127.0.0.1] (137.202.0.87) by SVR-IES-MBX-04.mgc.mentorg.com (139.181.222.4) with Microsoft SMTP Server (TLS) id 15.0.1263.5; Tue, 4 Jul 2017 11:18:58 +0100 Subject: [PATCH, 2/3] Handle GOMP_NVPTX_PTXRW in libgomp nvptx plugin From: Tom de Vries To: Thomas Schwinge , Jakub Jelinek CC: GCC Patches , Joseph Myers References: <2413b0f6-9cb2-243f-d805-08323a9c9a0a@mentor.com> <1de94c83-96da-f380-9964-1472f63270c9@mentor.com> <20170626152911.GK2123@tucnak> <87ziclsjed.fsf@hertz.schwinge.homeip.net> <80acb38b-1828-7d1b-e7fc-2a87cc0ad0ae@mentor.com> <809397ef-5508-5d7e-d4eb-f03213c5e690@mentor.com> Message-ID: Date: Tue, 4 Jul 2017 12:18:55 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.1 MIME-Version: 1.0 In-Reply-To: <809397ef-5508-5d7e-d4eb-f03213c5e690@mentor.com> X-ClientProxiedBy: svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) To SVR-IES-MBX-04.mgc.mentorg.com (139.181.222.4) On 07/04/2017 12:05 PM, Tom de Vries wrote: > On 07/03/2017 04:24 PM, Tom de Vries wrote: >> On 07/03/2017 04:08 PM, Thomas Schwinge wrote: >>> Hi! >>> >>> On Mon, 26 Jun 2017 17:29:11 +0200, Jakub Jelinek >>> wrote: >>>> On Mon, Jun 26, 2017 at 03:26:57PM +0000, Joseph Myers wrote: >>>>> On Mon, 26 Jun 2017, Tom de Vries wrote: >>>>> >>>>>>> 2. Handle GOMP_OPENACC_NVPTX_{DISASM,SAVE_TEMPS} in libgomp nvptx >>>>>>> plugin >>>>>> >>>>>> This patch adds handling of: >>>>>> - GOMP_OPENACC_NVPTX_SAVE_TEMPS=[01], and >>>>>> - GOMP_OPENACC_NVPTX_DISASM=[01] >>> >>> Why the "OPENACC" in these names? >> >> I took the format from 'GOMP_OPENACC_DIM'. >> >>> Doesn't this debugging aid apply to >>> any variant of offloading? >> >> I guess you're right. These environment variables would also be >> applicable for f.i. offloading via openmp on nvptx. I'll strip the >> 'OPENACC_' bit from the variables. >> >>>>>> The filename used for dumping the module is plugin-nvptx..cubin. >>> >>> Also, I suggest to make these names similar to their controlling >>> options, >>> that is: "gomp-nvptx*", for example. >>> >> >> Makes sense, will do. > > Changes in the patch series: > - removed OPENACC_ from environment variable names > - made temp files use gomp-nvptx prefix. > - fixed build error due to missing _GNU_SOURCE in libgomp-nvptx.c. > - merged the three GOMP_NVPTX_JIT patches into one > - rewrote GOMP_NVPTX_JIT to add no extra flags to the JIT compiler > invocation if GOMP_NVPTX_JIT if not defined, removing the need for > hardcoding default values > - added CU_JIT_TARGET to plugin/cuda/cuda.h > > Build on x86_64 with nvptx offloading enabled (using plugin/cuda/cuda.h). > > The patch series now looks like: > 1. Handle GOMP_NVPTX_{DISASM,SAVE_TEMPS} in libgomp nvptx plugin > 2. Handle GOMP_NVPTX_PTXRW in libgomp nvptx plugin > 3. Handle GOMP_NVPTX_JIT={-O[0-4],-ori,-arch=} in libgomp nvptx > plugin > > I'll repost the patch series in reply to this email. 2. Handle GOMP_NVPTX_PTXRW in libgomp nvptx plugin ( original submission at https://gcc.gnu.org/ml/gcc-patches/2017-06/msg01992.html ) Thanks, - Tom Handle GOMP_NVPTX_PTXRW in libgomp nvptx plugin 2017-06-27 Tom de Vries * plugin/plugin-nvptx.c (post_process_ptx): New function. (link_ptx): Call post_process_ptx. --- libgomp/plugin/plugin-nvptx.c | 132 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 130 insertions(+), 2 deletions(-) diff --git a/libgomp/plugin/plugin-nvptx.c b/libgomp/plugin/plugin-nvptx.c index 3e33c5b..cc2ee5e 100644 --- a/libgomp/plugin/plugin-nvptx.c +++ b/libgomp/plugin/plugin-nvptx.c @@ -980,6 +980,131 @@ debug_linkout (void *linkout, size_t linkoutsize) } } +/* If environment variable GOMP_NVPTX_PTXRW=[Ww], write *RES_CODE to file + gomp-nvptx..ptx. If it is [Rr], read *RES_CODE from file + instead. */ + +static void +post_process_ptx (unsigned num, const char **res_code, size_t *res_size) +{ + static int gomp_nvptx_ptxrw = -1; + + if (gomp_nvptx_ptxrw == -1) + { + const char *var_name = "GOMP_NVPTX_PTXRW"; + const char *env_var = secure_getenv (var_name); + notify_var (var_name, env_var); + + gomp_nvptx_ptxrw = 0; + if (env_var == NULL) + ; + else if ((env_var[0] == 'w' || env_var[0] == 'W') + && env_var[1] == '\0') + gomp_nvptx_ptxrw = 1; + else if ((env_var[0] == 'r' || env_var[0] == 'R') + && env_var[1] == '\0') + gomp_nvptx_ptxrw = 2; + else + GOMP_PLUGIN_error ("Error parsing %s", var_name); + } + + if (gomp_nvptx_ptxrw == 0) + return; + + const char *code = *res_code; + size_t size = *res_size; + + const char *prefix = "gomp-nvptx."; + const char *postfix = ".ptx"; + const int len = (strlen (prefix) + + 10 /* %u. */ + + strlen (postfix) + + 1 /* '\0'. */); + char file_name[len]; + int res = snprintf (file_name, len, "%s%u%s", prefix, + num, postfix); + assert (res < len); /* Assert there's no truncation. */ + + GOMP_PLUGIN_debug (0, "%s %s \n", + (gomp_nvptx_ptxrw == 1 ? "Writing" : "Reading"), + file_name); + + if (gomp_nvptx_ptxrw == 1) + { + FILE *ptx_file = fopen (file_name, "w"); + if (ptx_file == NULL) + { + GOMP_PLUGIN_debug (0, "Opening %s failed\n", file_name); + return; + } + + int res = fprintf (ptx_file, "%s", code); + unsigned int write_succeeded = res == size - 1; + if (!write_succeeded) + GOMP_PLUGIN_debug (0, + "Writing %s failed: written %d but expected %zu\n", + file_name, res, size - 1); + + res = fclose (ptx_file); + if (res != 0) + GOMP_PLUGIN_debug (0, "Closing %s failed\n", file_name); + + return; + } + + if (gomp_nvptx_ptxrw == 2) + { + FILE *ptx_file = fopen (file_name, "r"); + if (ptx_file == NULL) + { + GOMP_PLUGIN_debug (0, "Opening %s failed\n", file_name); + return; + } + + if (fseek (ptx_file, 0L, SEEK_END) != 0) + { + GOMP_PLUGIN_debug (0, "Seeking end of %s failed\n", file_name); + return; + } + + long bufsize = ftell (ptx_file); + if (bufsize == -1) + { + GOMP_PLUGIN_debug (0, "ftell of %s failed\n", file_name); + return; + } + + if (fseek (ptx_file, 0L, SEEK_SET) != 0) + { + GOMP_PLUGIN_debug (0, "Seeking start of %s failed\n", file_name); + return; + } + + char *new_code = GOMP_PLUGIN_malloc (sizeof (char) * (bufsize + 1)); + + size_t new_size = fread (new_code, sizeof (char), bufsize, ptx_file); + if (ferror (ptx_file) != 0) + { + GOMP_PLUGIN_debug (0, "Reading %s failed\n", file_name); + return; + } + + assert (new_size < bufsize + 1); + new_code[new_size++] = '\0'; + + int res = fclose (ptx_file); + if (res != 0) + { + GOMP_PLUGIN_debug (0, "Closing %s failed\n", file_name); + return; + } + + *res_code = new_code; + *res_size = new_size; + return; + } +} + static bool link_ptx (CUmodule *module, const struct targ_ptx_obj *ptx_objs, unsigned num_objs) @@ -1016,11 +1141,14 @@ link_ptx (CUmodule *module, const struct targ_ptx_obj *ptx_objs, for (; num_objs--; ptx_objs++) { + const char *ptx_code = ptx_objs->code; + size_t ptx_size = ptx_objs->size; + post_process_ptx (num_objs, &ptx_code, &ptx_size); + GOMP_PLUGIN_debug (0, "Loading:\n---\n%s\n---\n", ptx_code); /* cuLinkAddData's 'data' argument erroneously omits the const qualifier. */ - GOMP_PLUGIN_debug (0, "Loading:\n---\n%s\n---\n", ptx_objs->code); r = CUDA_CALL_NOCHECK (cuLinkAddData, linkstate, CU_JIT_INPUT_PTX, - (char *) ptx_objs->code, ptx_objs->size, + (char *) ptx_code, ptx_size, 0, 0, 0, 0); if (r != CUDA_SUCCESS) {