From owner-svn-ports-head@FreeBSD.ORG Mon Apr 27 04:50:22 2015 Return-Path: Delivered-To: svn-ports-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id D5F6328B; Mon, 27 Apr 2015 04:50:21 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id B6B891C46; Mon, 27 Apr 2015 04:50:21 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t3R4oLtw097103; Mon, 27 Apr 2015 04:50:21 GMT (envelope-from adrian@FreeBSD.org) Received: (from adrian@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t3R4oLRm097099; Mon, 27 Apr 2015 04:50:21 GMT (envelope-from adrian@FreeBSD.org) Message-Id: <201504270450.t3R4oLRm097099@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: adrian set sender to adrian@FreeBSD.org using -f From: Adrian Chadd Date: Mon, 27 Apr 2015 04:50:21 +0000 (UTC) To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r384815 - in head/lang/gcc48: . files X-SVN-Group: ports-head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-ports-head@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the ports tree for head List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 27 Apr 2015 04:50:22 -0000 Author: adrian (src committer) Date: Mon Apr 27 04:50:20 2015 New Revision: 384815 URL: https://svnweb.freebsd.org/changeset/ports/384815 Log: Implement the FreeBSD specific pieces for thread affinity for OpenMP. Upstream gcc 4.8 doesn't have support for this - it'll create threads, but it won't do any of the thread affinity stuff for FreeBSD. This allows for OMP_PROC_BIND=true to bind threads to their initial CPUs, leading to some pretty drastic improvements in performance for certain NUMA workloads. Approved by: gerald Sponsored by: Norse Corp, Inc. Added: head/lang/gcc48/files/patch-libgomp-freebsd-affinity (contents, props changed) head/lang/gcc48/files/patch-libgomp-posix-affinity (contents, props changed) Modified: head/lang/gcc48/Makefile Modified: head/lang/gcc48/Makefile ============================================================================== --- head/lang/gcc48/Makefile Mon Apr 27 04:08:01 2015 (r384814) +++ head/lang/gcc48/Makefile Mon Apr 27 04:50:20 2015 (r384815) @@ -3,6 +3,7 @@ PORTNAME= gcc PORTVERSION= 4.8.5.s20150402 +PORTREVISION= 1 CATEGORIES= lang java MASTER_SITES= ${MASTER_SITE_GCC} MASTER_SITE_SUBDIR= snapshots/${DISTVERSION} Added: head/lang/gcc48/files/patch-libgomp-freebsd-affinity ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/lang/gcc48/files/patch-libgomp-freebsd-affinity Mon Apr 27 04:50:20 2015 (r384815) @@ -0,0 +1,117 @@ +--- libgomp/config/bsd/freebsd_affinity.c.orig 2015-04-26 05:29:16.795040000 -0700 ++++ libgomp/config/bsd/freebsd_affinity.c 2015-04-26 05:29:03.462728000 -0700 +@@ -0,0 +1,114 @@ ++/* Copyright (C) 2015 Free Software Foundation, Inc. ++ Contributed by Adrian Chadd . ++ Based on work by Jakub Jelinek . ++ ++ This file is part of the GNU OpenMP Library (libgomp). ++ ++ Libgomp is free software; you can redistribute it and/or modify it ++ under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3, or (at your option) ++ any later version. ++ ++ Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ++ FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ more details. ++ ++ Under Section 7 of GPL version 3, you are granted additional ++ permissions described in the GCC Runtime Library Exception, version ++ 3.1, as published by the Free Software Foundation. ++ ++ You should have received a copy of the GNU General Public License and ++ a copy of the GCC Runtime Library Exception along with this program; ++ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ++ . */ ++ ++/* This is a FreeBSD specific implementation of a CPU affinity setting. */ ++ ++#include "libgomp.h" ++ ++#include ++#include ++#include ++#include ++ ++static unsigned int affinity_counter; ++ ++void ++gomp_init_affinity (void) ++{ ++ cpuset_t cpuset, cpusetnew; ++ size_t idx, widx; ++ unsigned long cpus = 0; ++ ++ if (pthread_getaffinity_np (pthread_self (), sizeof (cpuset), &cpuset)) ++ { ++ gomp_error ("could not get CPU affinity set"); ++ free (gomp_cpu_affinity); ++ gomp_cpu_affinity = NULL; ++ gomp_cpu_affinity_len = 0; ++ return; ++ } ++ ++ CPU_ZERO (&cpusetnew); ++ if (gomp_cpu_affinity_len == 0) ++ { ++ unsigned long count = CPU_COUNT(&cpuset); ++ if (count >= 65536) ++ count = 65536; ++ gomp_cpu_affinity = malloc (count * sizeof (unsigned short)); ++ if (gomp_cpu_affinity == NULL) ++ { ++ gomp_error ("not enough memory to store CPU affinity list"); ++ return; ++ } ++ for (widx = idx = 0; widx < count && idx < 65536; idx++) ++ if (CPU_ISSET (idx, &cpuset)) ++ { ++ cpus++; ++ gomp_cpu_affinity[widx++] = idx; ++ } ++ } ++ else ++ for (widx = idx = 0; idx < gomp_cpu_affinity_len; idx++) ++ if (gomp_cpu_affinity[idx] < CPU_SETSIZE ++ && CPU_ISSET (gomp_cpu_affinity[idx], &cpuset)) ++ { ++ if (! CPU_ISSET (gomp_cpu_affinity[idx], &cpusetnew)) ++ { ++ cpus++; ++ CPU_SET (gomp_cpu_affinity[idx], &cpusetnew); ++ } ++ gomp_cpu_affinity[widx++] = gomp_cpu_affinity[idx]; ++ } ++ ++ if (widx == 0) ++ { ++ gomp_error ("no CPUs left for affinity setting"); ++ free (gomp_cpu_affinity); ++ gomp_cpu_affinity = NULL; ++ gomp_cpu_affinity_len = 0; ++ return; ++ } ++ ++ gomp_cpu_affinity_len = widx; ++ if (cpus < gomp_available_cpus) ++ gomp_available_cpus = cpus; ++ CPU_ZERO (&cpuset); ++ CPU_SET (gomp_cpu_affinity[0], &cpuset); ++ pthread_setaffinity_np (pthread_self (), sizeof (cpuset), &cpuset); ++ affinity_counter = 1; ++} ++ ++void ++gomp_init_thread_affinity (pthread_attr_t *attr) ++{ ++ unsigned int cpu; ++ cpuset_t cpuset; ++ ++ cpu = __atomic_fetch_add (&affinity_counter, 1, MEMMODEL_RELAXED); ++ cpu %= gomp_cpu_affinity_len; ++ CPU_ZERO (&cpuset); ++ CPU_SET (gomp_cpu_affinity[cpu], &cpuset); ++ pthread_attr_setaffinity_np (attr, sizeof (cpuset_t), &cpuset); ++} Added: head/lang/gcc48/files/patch-libgomp-posix-affinity ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/lang/gcc48/files/patch-libgomp-posix-affinity Mon Apr 27 04:50:20 2015 (r384815) @@ -0,0 +1,18 @@ +--- libgomp/config/posix/affinity.c.orig 2015-04-26 05:29:27.925344000 -0700 ++++ libgomp/config/posix/affinity.c 2015-04-26 05:29:44.449277000 -0700 +@@ -26,6 +26,10 @@ + + #include "libgomp.h" + ++#ifdef __FreeBSD__ ++#include "../bsd/freebsd_affinity.c" ++#else ++ + void + gomp_init_affinity (void) + { +@@ -36,3 +40,4 @@ + { + (void) attr; + } ++#endif