Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Linq / Parallel / Scheduling / Scheduling.cs / 1305376 / Scheduling.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
//
// Scheduling.cs
//
// [....]
//
// Infrastructure for setting up concurrent work, marshaling exceptions, determining
// the recommended degree-of-parallelism, and so forth.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Threading;
using System.Diagnostics.Contracts;
using System.Threading.Tasks;
using System.Security;
using System.Security.Permissions;
namespace System.Linq.Parallel
{
//------------------------------------------------------------------------------------
// A simple helper class that offers common task scheduling functionality.
//
internal static class Scheduling
{
// Whether to preserve order by default, when neither AsOrdered nor AsUnordered is used.
internal const bool DefaultPreserveOrder = false;
// The default degree of parallelism, or -1 if unspecified. Dev unit tests set this value
// to change the default DOP.
internal static int DefaultDegreeOfParallelism = Math.Min(Environment.ProcessorCount, MAX_SUPPORTED_DOP);
// The size to use for bounded buffers. @
internal const int DEFAULT_BOUNDED_BUFFER_CAPACITY = 512;
// The number of bytes we want "chunks" to be, when partitioning, etc. We choose 4 cache
// lines worth, assuming 128b cache line. Most (popular) architectures use 64b cache lines,
// but choosing 128b works for 64b too whereas a multiple of 64b isn't necessarily sufficient
// for 128b cache systems. So 128b it is.
internal const int DEFAULT_BYTES_PER_CHUNK = 128 * 4;
// The number of milliseconds before we assume a producer has been zombied.
// @
internal const int ZOMBIED_PRODUCER_TIMEOUT = Timeout.Infinite;
// The largest number of partitions that PLINQ supports.
internal const int MAX_SUPPORTED_DOP = 63;
//-----------------------------------------------------------------------------------
// Calculates the proper amount of DOP. This takes into consideration dynamic nesting.
//
internal static int GetDefaultDegreeOfParallelism()
{
return DefaultDegreeOfParallelism;
}
//-----------------------------------------------------------------------------------
// Gets the recommended "chunk size" for a particular CLR type.
//
// Notes:
// We try to recommend some reasonable "chunk size" for the data, but this is
// clearly a tradeoff, and requires a bit of experimentation. A larger chunk size
// can help locality, but if it's too big we may end up either stalling another
// partition (if enumerators are calculating data on demand) or skewing the
// distribution of data among the partitions.
//
internal static int GetDefaultChunkSize()
{
int chunkSize;
if (typeof(T).IsValueType)
{
// @
if (typeof(T).StructLayoutAttribute.Value == LayoutKind.Explicit)
{
chunkSize = Math.Max(1, DEFAULT_BYTES_PER_CHUNK / Marshal.SizeOf(typeof(T)));
}
else
{
// We choose '128' because this ensures, no matter the actual size of the value type,
// the total bytes used will be a multiple of 128. This ensures it's cache aligned.
chunkSize = 128;
}
}
else
{
Contract.Assert((DEFAULT_BYTES_PER_CHUNK % IntPtr.Size) == 0, "bytes per chunk should be a multiple of pointer size");
chunkSize = (DEFAULT_BYTES_PER_CHUNK / IntPtr.Size);
}
TraceHelpers.TraceInfo("Scheduling::GetDefaultChunkSize({0}) -- returning {1}", typeof(T), chunkSize);
return chunkSize;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
//
// Scheduling.cs
//
// [....]
//
// Infrastructure for setting up concurrent work, marshaling exceptions, determining
// the recommended degree-of-parallelism, and so forth.
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Threading;
using System.Diagnostics.Contracts;
using System.Threading.Tasks;
using System.Security;
using System.Security.Permissions;
namespace System.Linq.Parallel
{
//------------------------------------------------------------------------------------
// A simple helper class that offers common task scheduling functionality.
//
internal static class Scheduling
{
// Whether to preserve order by default, when neither AsOrdered nor AsUnordered is used.
internal const bool DefaultPreserveOrder = false;
// The default degree of parallelism, or -1 if unspecified. Dev unit tests set this value
// to change the default DOP.
internal static int DefaultDegreeOfParallelism = Math.Min(Environment.ProcessorCount, MAX_SUPPORTED_DOP);
// The size to use for bounded buffers. @
internal const int DEFAULT_BOUNDED_BUFFER_CAPACITY = 512;
// The number of bytes we want "chunks" to be, when partitioning, etc. We choose 4 cache
// lines worth, assuming 128b cache line. Most (popular) architectures use 64b cache lines,
// but choosing 128b works for 64b too whereas a multiple of 64b isn't necessarily sufficient
// for 128b cache systems. So 128b it is.
internal const int DEFAULT_BYTES_PER_CHUNK = 128 * 4;
// The number of milliseconds before we assume a producer has been zombied.
// @
internal const int ZOMBIED_PRODUCER_TIMEOUT = Timeout.Infinite;
// The largest number of partitions that PLINQ supports.
internal const int MAX_SUPPORTED_DOP = 63;
//-----------------------------------------------------------------------------------
// Calculates the proper amount of DOP. This takes into consideration dynamic nesting.
//
internal static int GetDefaultDegreeOfParallelism()
{
return DefaultDegreeOfParallelism;
}
//-----------------------------------------------------------------------------------
// Gets the recommended "chunk size" for a particular CLR type.
//
// Notes:
// We try to recommend some reasonable "chunk size" for the data, but this is
// clearly a tradeoff, and requires a bit of experimentation. A larger chunk size
// can help locality, but if it's too big we may end up either stalling another
// partition (if enumerators are calculating data on demand) or skewing the
// distribution of data among the partitions.
//
internal static int GetDefaultChunkSize()
{
int chunkSize;
if (typeof(T).IsValueType)
{
// @
if (typeof(T).StructLayoutAttribute.Value == LayoutKind.Explicit)
{
chunkSize = Math.Max(1, DEFAULT_BYTES_PER_CHUNK / Marshal.SizeOf(typeof(T)));
}
else
{
// We choose '128' because this ensures, no matter the actual size of the value type,
// the total bytes used will be a multiple of 128. This ensures it's cache aligned.
chunkSize = 128;
}
}
else
{
Contract.Assert((DEFAULT_BYTES_PER_CHUNK % IntPtr.Size) == 0, "bytes per chunk should be a multiple of pointer size");
chunkSize = (DEFAULT_BYTES_PER_CHUNK / IntPtr.Size);
}
TraceHelpers.TraceInfo("Scheduling::GetDefaultChunkSize({0}) -- returning {1}", typeof(T), chunkSize);
return chunkSize;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- UpdatePanelTrigger.cs
- DataGridViewTextBoxEditingControl.cs
- SubMenuStyle.cs
- returneventsaver.cs
- DesignDataSource.cs
- RichTextBox.cs
- StylusEventArgs.cs
- XmlSchemaSimpleTypeRestriction.cs
- NetCodeGroup.cs
- ListDictionaryInternal.cs
- updatecommandorderer.cs
- DiscoveryProxy.cs
- TextFindEngine.cs
- XamlWrappingReader.cs
- Pens.cs
- TemplateEditingVerb.cs
- StaticExtensionConverter.cs
- XmlLanguage.cs
- ScriptingRoleServiceSection.cs
- TcpClientSocketManager.cs
- DataGridRowClipboardEventArgs.cs
- ToolConsole.cs
- StylusEventArgs.cs
- SettingsPropertyNotFoundException.cs
- ObjectListShowCommandsEventArgs.cs
- Viewport3DAutomationPeer.cs
- Baml2006KnownTypes.cs
- ConfigXmlAttribute.cs
- ConfigurationPermission.cs
- GPPOINT.cs
- DataSourceControlBuilder.cs
- GeometryGroup.cs
- InertiaExpansionBehavior.cs
- ToRequest.cs
- TemplateControlCodeDomTreeGenerator.cs
- SiteOfOriginPart.cs
- ObjectAnimationUsingKeyFrames.cs
- DebugView.cs
- InternalEnumValidator.cs
- FtpWebResponse.cs
- _DisconnectOverlappedAsyncResult.cs
- _LocalDataStore.cs
- TabPageDesigner.cs
- RayHitTestParameters.cs
- KeyNotFoundException.cs
- ListViewSortEventArgs.cs
- LoadRetryAsyncResult.cs
- XmlSchemaAttributeGroupRef.cs
- SecurityElement.cs
- FloaterParaClient.cs
- WebPartConnectionCollection.cs
- UnsafeNativeMethods.cs
- ParameterDataSourceExpression.cs
- DbModificationClause.cs
- IsolatedStorageException.cs
- Vector3DAnimationBase.cs
- CheckedListBox.cs
- TransformGroup.cs
- FrameworkContentElement.cs
- XamlTreeBuilder.cs
- SQLChars.cs
- MultiBinding.cs
- XmlSchemaNotation.cs
- Style.cs
- GlyphCollection.cs
- AttachmentService.cs
- HttpCachePolicy.cs
- QueryReaderSettings.cs
- PartBasedPackageProperties.cs
- TransactionScope.cs
- EncodingInfo.cs
- StateManagedCollection.cs
- LoginView.cs
- MetadataUtil.cs
- ResponseBodyWriter.cs
- ComNativeDescriptor.cs
- CompilerTypeWithParams.cs
- SiteMapNode.cs
- SqlCommandSet.cs
- APCustomTypeDescriptor.cs
- SQLStringStorage.cs
- CompilationUnit.cs
- ClusterSafeNativeMethods.cs
- PropertyCollection.cs
- RealProxy.cs
- IisTraceWebEventProvider.cs
- WasNotInstalledException.cs
- DataGridCell.cs
- ReadOnlyHierarchicalDataSource.cs
- connectionpool.cs
- ObjectDataSourceEventArgs.cs
- GlobalizationAssembly.cs
- BaseParagraph.cs
- SQLInt64Storage.cs
- HttpRequestMessageProperty.cs
- PhoneCallDesigner.cs
- CompilerGeneratedAttribute.cs
- HighlightVisual.cs
- SinglePhaseEnlistment.cs
- AsmxEndpointPickerExtension.cs