Looking at a [post from the MSDN team][1], I've come up with a way to reliably get the physical core count from a machine, and use that to determine a good MAXDOP setting.

By "good", I mean conservative.  That is, my requirement is to use a maximum of 75% of the cores in a NUMA node, or an overall maximum of 8 cores.  

PowerShell is used to determine the physical core count:

    powershell -OutputFormat Text -NoLogo -Command "& {Get-WmiObject -namespace 
    "root\CIMV2" -class Win32_Processor -Property NumberOfCores} | select NumberOfCores"

One can also use PowerShell to determine the number of logical cores, which would likely be double the number of physical cores if HyperThreading is turned on:

    powershell -OutputFormat Text -NoLogo -Command "& {Get-WmiObject -namespace 
    "root\CIMV2" -class Win32_Processor -Property NumberOfCores} 
    | select NumberOfLogicalProcessors"

    /* 
       This will recommend a MAXDOP setting appropriate for your machine's NUMA memory
       configuration.  You will need to evaluate this setting in a non-production 
       environment before moving it to production.
    
       MAXDOP can be configured using:  
       EXEC sp_configure 'max degree of parallelism',X;
       RECONFIGURE
    
       If this instance is hosting a Sharepoint database, you MUST specify MAXDOP=1 
       (URL wrapped for readability)
       http://blogs.msdn.com/b/rcormier/archive/2012/10/25/
       you-shall-configure-your-maxdop-when-using-sharepoint-2013.aspx
    
       Biztalk (all versions, including 2010): 
       MAXDOP = 1 is only required on the BizTalk Message Box
       database server(s), and must not be changed; all other servers hosting other 
       BizTalk Server databases may return this value to 0 if set.
       http://support.microsoft.com/kb/899000
    */
    SET NOCOUNT ON;
    
    DECLARE @CoreCount int;
    SET @CoreCount = 0;
    DECLARE @NumaNodes int;
    
    /*  see if xp_cmdshell is enabled, so we can try to use 
    	PowerShell to determine the real core count
    */
    DECLARE @T TABLE (
    	name varchar(255)
    	, minimum int
    	, maximum int
    	, config_value int
    	, run_value int
    );
    INSERT INTO @T 
    EXEC sp_configure 'xp_cmdshell';
    DECLARE @cmdshellEnabled BIT;
    SET @cmdshellEnabled = 0;
    SELECT @cmdshellEnabled = 1 
    FROM @T
    WHERE run_value = 1;
    IF @cmdshellEnabled = 1
    BEGIN
    	CREATE TABLE #cmdshell
    	(
    		txt VARCHAR(255)
    	);
    	INSERT INTO #cmdshell (txt)
    	EXEC xp_cmdshell 'powershell -OutputFormat Text -NoLogo -Command "& {Get-WmiObject -namespace "root\CIMV2" -class Win32_Processor -Property NumberOfCores} | select NumberOfCores"';
    	SELECT @CoreCount = CONVERT(INT, LTRIM(RTRIM(txt)))
    	FROM #cmdshell
    	WHERE ISNUMERIC(LTRIM(RTRIM(txt)))=1;
    	DROP TABLE #cmdshell;
    END
    IF @CoreCount = 0 
    BEGIN
    	/* 
    		Could not use PowerShell to get the corecount, use SQL Server's 
    		unreliable number.  For machines with hyperthreading enabled
    		this number is (typically) twice the physical core count.
    	*/
    	SET @CoreCount = (SELECT i.cpu_count from sys.dm_os_sys_info i); 
    END
    
    SET @NumaNodes = (
        SELECT MAX(c.memory_node_id) + 1 
        FROM sys.dm_os_memory_clerks c 
        WHERE memory_node_id < 64
        );
    
    IF @CoreCount > 4 /* If less than 5 cores, don't bother. */
    BEGIN
        DECLARE @MaxDOP int;
    
        /* 3/4 of Total Cores in Machine */
        SET @MaxDOP = @CoreCount * 0.75; 
    
        /* if @MaxDOP is greater than the per NUMA node
           Core Count, set @MaxDOP = per NUMA node core count
        */
        IF @MaxDOP > (@CoreCount / @NumaNodes) 
            SET @MaxDOP = (@CoreCount / @NumaNodes) * 0.75;
    
        /*
            Reduce @MaxDOP to an even number 
        */
        SET @MaxDOP = @MaxDOP - (@MaxDOP % 2);
    
        /* Cap MAXDOP at 8, according to Microsoft */
        IF @MaxDOP > 8 SET @MaxDOP = 8;
    
        PRINT 'Suggested MAXDOP = ' + CAST(@MaxDOP as varchar(max));
    END
    ELSE
    BEGIN
        PRINT 'Suggested MAXDOP = 0 since you have less than 5 cores total.';
        PRINT 'This is the default setting, you likely do not need to do';
        PRINT 'anything.';
    END


  [1]: http://blogs.msdn.com/b/sqlsakthi/p/maxdop-calculator-sqlserver.aspx