haikuwebkit/Source/WTF/wtf/ParallelJobsLibdispatch.h

71 lines
2.5 KiB
C
Raw Permalink Normal View History

2011-04-26 Gabor Loki <loki@webkit.org> Reviewed by Csaba Osztrogonác. Speeding up SVG filters with multicore (SMP) support https://bugs.webkit.org/show_bug.cgi?id=43903 Some SVG filters execute a huge number of pixel manipulations, which cannot be sped up by graphics accelerators, since their algorithm is too complex. Using the power of Symmetric Multi Processing (SMP) we can split up a task to smaller (data independent) tasks, which can be executed independently. The ParallelJobs framework provides a simple way for distributed programming. The framework is based on WebKit's threading infrastructure, Open Multi-Processing's (OpenMP) API, and libdispatch API. * GNUmakefile.list.am: * JavaScriptCore.vcproj/WTF/WTF.vcproj: * JavaScriptCore.xcodeproj/project.pbxproj: * wtf/CMakeLists.txt: * wtf/ParallelJobs.h: Added. (WTF::ParallelJobs::ParallelJobs): (WTF::ParallelJobs::numberOfJobs): (WTF::ParallelJobs::parameterForJob): (WTF::ParallelJobs::executeJobs): * wtf/ParallelJobsGeneric.cpp: Added. (WTF::ParallelEnvironment::ThreadPrivate::tryLockFor): (WTF::ParallelEnvironment::ThreadPrivate::executeJob): (WTF::ParallelEnvironment::ThreadPrivate::waitForFinish): (WTF::ParallelEnvironment::ThreadPrivate::workerThread): * wtf/ParallelJobsGeneric.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): (WTF::ParallelEnvironment::ThreadPrivate::ThreadPrivate): (WTF::ParallelEnvironment::ThreadPrivate::create): * wtf/ParallelJobsLibdispatch.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): * wtf/ParallelJobsOpenMP.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): * wtf/Platform.h: * wtf/wtf.pri: 2011-04-26 Gabor Loki <loki@webkit.org> Reviewed by Csaba Osztrogonác. Speeding up SVG filters with multicore (SMP) support https://bugs.webkit.org/show_bug.cgi?id=43903 Some SVG filters execute a huge number of pixel manipulations, which cannot be sped up by graphics accelerators, since their algorithm is too complex. Using the power of Symmetric Multi Processing (SMP) we can split up a task to smaller (data independent) tasks, which can be executed independently. The ParallelJobs framework provides a simple way for distributed programming. The framework is based on WebKit's threading infrastructure, Open Multi-Processing's (OpenMP) API, and libdispatch API. * ForwardingHeaders/wtf/ParallelJobs.h: Added. * platform/graphics/filters/FETurbulence.cpp: (WebCore::FETurbulence::PaintingData::PaintingData): (WebCore::FETurbulence::noise2D): (WebCore::FETurbulence::calculateTurbulenceValueForPoint): (WebCore::FETurbulence::fillRegion): (WebCore::FETurbulence::fillRegionWorker): (WebCore::FETurbulence::apply): * platform/graphics/filters/FETurbulence.h: Canonical link: https://commits.webkit.org/74633@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@84911 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2011-04-26 14:40:47 +00:00
/*
* Copyright (C) 2011 University of Szeged
* Copyright (C) 2011 Gabor Loki <loki@webkit.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
Use pragma once in WTF https://bugs.webkit.org/show_bug.cgi?id=190527 Reviewed by Chris Dumez. Source/WTF: We also need to consistently include wtf headers from within wtf so we can build wtf without symbol redefinition errors from including the copy in Source and the copy in the build directory. * wtf/ASCIICType.h: * wtf/Assertions.cpp: * wtf/Assertions.h: * wtf/Atomics.h: * wtf/AutomaticThread.cpp: * wtf/AutomaticThread.h: * wtf/BackwardsGraph.h: * wtf/Bag.h: * wtf/BagToHashMap.h: * wtf/BitVector.cpp: * wtf/BitVector.h: * wtf/Bitmap.h: * wtf/BloomFilter.h: * wtf/Box.h: * wtf/BubbleSort.h: * wtf/BumpPointerAllocator.h: * wtf/ByteOrder.h: * wtf/CPUTime.cpp: * wtf/CallbackAggregator.h: * wtf/CheckedArithmetic.h: * wtf/CheckedBoolean.h: * wtf/ClockType.cpp: * wtf/ClockType.h: * wtf/CommaPrinter.h: * wtf/CompilationThread.cpp: * wtf/CompilationThread.h: * wtf/Compiler.h: * wtf/ConcurrentPtrHashSet.cpp: * wtf/ConcurrentVector.h: * wtf/Condition.h: * wtf/CountingLock.cpp: * wtf/CrossThreadTaskHandler.cpp: * wtf/CryptographicUtilities.cpp: * wtf/CryptographicUtilities.h: * wtf/CryptographicallyRandomNumber.cpp: * wtf/CryptographicallyRandomNumber.h: * wtf/CurrentTime.cpp: * wtf/DataLog.cpp: * wtf/DataLog.h: * wtf/DateMath.cpp: * wtf/DateMath.h: * wtf/DecimalNumber.cpp: * wtf/DecimalNumber.h: * wtf/Deque.h: * wtf/DisallowCType.h: * wtf/Dominators.h: * wtf/DoublyLinkedList.h: * wtf/FastBitVector.cpp: * wtf/FastMalloc.cpp: * wtf/FastMalloc.h: * wtf/FeatureDefines.h: * wtf/FilePrintStream.cpp: * wtf/FilePrintStream.h: * wtf/FlipBytes.h: * wtf/FunctionDispatcher.cpp: * wtf/FunctionDispatcher.h: * wtf/GetPtr.h: * wtf/Gigacage.cpp: * wtf/GlobalVersion.cpp: * wtf/GraphNodeWorklist.h: * wtf/GregorianDateTime.cpp: * wtf/GregorianDateTime.h: * wtf/HashFunctions.h: * wtf/HashMap.h: * wtf/HashMethod.h: * wtf/HashSet.h: * wtf/HashTable.cpp: * wtf/HashTraits.h: * wtf/Indenter.h: * wtf/IndexSparseSet.h: * wtf/InlineASM.h: * wtf/Insertion.h: * wtf/IteratorAdaptors.h: * wtf/IteratorRange.h: * wtf/JSONValues.cpp: * wtf/JSValueMalloc.cpp: * wtf/LEBDecoder.h: * wtf/Language.cpp: * wtf/ListDump.h: * wtf/Lock.cpp: * wtf/Lock.h: * wtf/LockAlgorithm.h: * wtf/LockedPrintStream.cpp: * wtf/Locker.h: * wtf/MD5.cpp: * wtf/MD5.h: * wtf/MainThread.cpp: * wtf/MainThread.h: * wtf/MallocPtr.h: * wtf/MathExtras.h: * wtf/MediaTime.cpp: * wtf/MediaTime.h: * wtf/MemoryPressureHandler.cpp: * wtf/MessageQueue.h: * wtf/MetaAllocator.cpp: * wtf/MetaAllocator.h: * wtf/MetaAllocatorHandle.h: * wtf/MonotonicTime.cpp: * wtf/MonotonicTime.h: * wtf/NakedPtr.h: * wtf/NoLock.h: * wtf/NoTailCalls.h: * wtf/Noncopyable.h: * wtf/NumberOfCores.cpp: * wtf/NumberOfCores.h: * wtf/OSAllocator.h: * wtf/OSAllocatorPosix.cpp: * wtf/OSRandomSource.cpp: * wtf/OSRandomSource.h: * wtf/ObjcRuntimeExtras.h: * wtf/OrderMaker.h: * wtf/PackedIntVector.h: * wtf/PageAllocation.h: * wtf/PageBlock.cpp: * wtf/PageBlock.h: * wtf/PageReservation.h: * wtf/ParallelHelperPool.cpp: * wtf/ParallelHelperPool.h: * wtf/ParallelJobs.h: * wtf/ParallelJobsLibdispatch.h: * wtf/ParallelVectorIterator.h: * wtf/ParkingLot.cpp: * wtf/ParkingLot.h: * wtf/Platform.h: * wtf/PointerComparison.h: * wtf/Poisoned.cpp: * wtf/PrintStream.cpp: * wtf/PrintStream.h: * wtf/ProcessID.h: * wtf/ProcessPrivilege.cpp: * wtf/RAMSize.cpp: * wtf/RAMSize.h: * wtf/RandomDevice.cpp: * wtf/RandomNumber.cpp: * wtf/RandomNumber.h: * wtf/RandomNumberSeed.h: * wtf/RangeSet.h: * wtf/RawPointer.h: * wtf/ReadWriteLock.cpp: * wtf/RedBlackTree.h: * wtf/Ref.h: * wtf/RefCountedArray.h: * wtf/RefCountedLeakCounter.cpp: * wtf/RefCountedLeakCounter.h: * wtf/RefCounter.h: * wtf/RefPtr.h: * wtf/RetainPtr.h: * wtf/RunLoop.cpp: * wtf/RunLoop.h: * wtf/RunLoopTimer.h: * wtf/RunLoopTimerCF.cpp: * wtf/SHA1.cpp: * wtf/SHA1.h: * wtf/SaturatedArithmetic.h: (saturatedSubtraction): * wtf/SchedulePair.h: * wtf/SchedulePairCF.cpp: * wtf/SchedulePairMac.mm: * wtf/ScopedLambda.h: * wtf/Seconds.cpp: * wtf/Seconds.h: * wtf/SegmentedVector.h: * wtf/SentinelLinkedList.h: * wtf/SharedTask.h: * wtf/SimpleStats.h: * wtf/SingleRootGraph.h: * wtf/SinglyLinkedList.h: * wtf/SixCharacterHash.cpp: * wtf/SixCharacterHash.h: * wtf/SmallPtrSet.h: * wtf/Spectrum.h: * wtf/StackBounds.cpp: * wtf/StackBounds.h: * wtf/StackStats.cpp: * wtf/StackStats.h: * wtf/StackTrace.cpp: * wtf/StdLibExtras.h: * wtf/StreamBuffer.h: * wtf/StringHashDumpContext.h: * wtf/StringPrintStream.cpp: * wtf/StringPrintStream.h: * wtf/ThreadGroup.cpp: * wtf/ThreadMessage.cpp: * wtf/ThreadSpecific.h: * wtf/Threading.cpp: * wtf/Threading.h: * wtf/ThreadingPrimitives.h: * wtf/ThreadingPthreads.cpp: * wtf/TimeWithDynamicClockType.cpp: * wtf/TimeWithDynamicClockType.h: * wtf/TimingScope.cpp: * wtf/TinyLRUCache.h: * wtf/TinyPtrSet.h: * wtf/TriState.h: * wtf/TypeCasts.h: * wtf/UUID.cpp: * wtf/UnionFind.h: * wtf/VMTags.h: * wtf/ValueCheck.h: * wtf/Vector.h: * wtf/VectorTraits.h: * wtf/WallTime.cpp: * wtf/WallTime.h: * wtf/WeakPtr.h: * wtf/WeakRandom.h: * wtf/WordLock.cpp: * wtf/WordLock.h: * wtf/WorkQueue.cpp: * wtf/WorkQueue.h: * wtf/WorkerPool.cpp: * wtf/cf/LanguageCF.cpp: * wtf/cf/RunLoopCF.cpp: * wtf/cocoa/Entitlements.mm: * wtf/cocoa/MachSendRight.cpp: * wtf/cocoa/MainThreadCocoa.mm: * wtf/cocoa/MemoryFootprintCocoa.cpp: * wtf/cocoa/WorkQueueCocoa.cpp: * wtf/dtoa.cpp: * wtf/dtoa.h: * wtf/ios/WebCoreThread.cpp: * wtf/ios/WebCoreThread.h: * wtf/mac/AppKitCompatibilityDeclarations.h: * wtf/mac/DeprecatedSymbolsUsedBySafari.mm: * wtf/mbmalloc.cpp: * wtf/persistence/PersistentCoders.cpp: * wtf/persistence/PersistentDecoder.cpp: * wtf/persistence/PersistentEncoder.cpp: * wtf/spi/cf/CFBundleSPI.h: * wtf/spi/darwin/CommonCryptoSPI.h: * wtf/text/ASCIIFastPath.h: * wtf/text/ASCIILiteral.cpp: * wtf/text/AtomicString.cpp: * wtf/text/AtomicString.h: * wtf/text/AtomicStringHash.h: * wtf/text/AtomicStringImpl.cpp: * wtf/text/AtomicStringImpl.h: * wtf/text/AtomicStringTable.cpp: * wtf/text/AtomicStringTable.h: * wtf/text/Base64.cpp: * wtf/text/CString.cpp: * wtf/text/CString.h: * wtf/text/ConversionMode.h: * wtf/text/ExternalStringImpl.cpp: * wtf/text/IntegerToStringConversion.h: * wtf/text/LChar.h: * wtf/text/LineEnding.cpp: * wtf/text/StringBuffer.h: * wtf/text/StringBuilder.cpp: * wtf/text/StringBuilder.h: * wtf/text/StringBuilderJSON.cpp: * wtf/text/StringCommon.h: * wtf/text/StringConcatenate.h: * wtf/text/StringHash.h: * wtf/text/StringImpl.cpp: * wtf/text/StringImpl.h: * wtf/text/StringOperators.h: * wtf/text/StringView.cpp: * wtf/text/StringView.h: * wtf/text/SymbolImpl.cpp: * wtf/text/SymbolRegistry.cpp: * wtf/text/SymbolRegistry.h: * wtf/text/TextBreakIterator.cpp: * wtf/text/TextBreakIterator.h: * wtf/text/TextBreakIteratorInternalICU.h: * wtf/text/TextPosition.h: * wtf/text/TextStream.cpp: * wtf/text/UniquedStringImpl.h: * wtf/text/WTFString.cpp: * wtf/text/WTFString.h: * wtf/text/cocoa/StringCocoa.mm: * wtf/text/cocoa/StringViewCocoa.mm: * wtf/text/cocoa/TextBreakIteratorInternalICUCocoa.cpp: * wtf/text/icu/UTextProvider.cpp: * wtf/text/icu/UTextProvider.h: * wtf/text/icu/UTextProviderLatin1.cpp: * wtf/text/icu/UTextProviderLatin1.h: * wtf/text/icu/UTextProviderUTF16.cpp: * wtf/text/icu/UTextProviderUTF16.h: * wtf/threads/BinarySemaphore.cpp: * wtf/threads/BinarySemaphore.h: * wtf/threads/Signals.cpp: * wtf/unicode/CharacterNames.h: * wtf/unicode/Collator.h: * wtf/unicode/CollatorDefault.cpp: * wtf/unicode/UTF8.cpp: * wtf/unicode/UTF8.h: Tools: Put WorkQueue in namespace DRT so it does not conflict with WTF::WorkQueue. * DumpRenderTree/TestRunner.cpp: (TestRunner::queueLoadHTMLString): (TestRunner::queueLoadAlternateHTMLString): (TestRunner::queueBackNavigation): (TestRunner::queueForwardNavigation): (TestRunner::queueLoadingScript): (TestRunner::queueNonLoadingScript): (TestRunner::queueReload): * DumpRenderTree/WorkQueue.cpp: (WorkQueue::singleton): Deleted. (WorkQueue::WorkQueue): Deleted. (WorkQueue::queue): Deleted. (WorkQueue::dequeue): Deleted. (WorkQueue::count): Deleted. (WorkQueue::clear): Deleted. (WorkQueue::processWork): Deleted. * DumpRenderTree/WorkQueue.h: (WorkQueue::setFrozen): Deleted. * DumpRenderTree/WorkQueueItem.h: * DumpRenderTree/mac/DumpRenderTree.mm: (runTest): * DumpRenderTree/mac/FrameLoadDelegate.mm: (-[FrameLoadDelegate processWork:]): (-[FrameLoadDelegate webView:locationChangeDone:forDataSource:]): * DumpRenderTree/mac/TestRunnerMac.mm: (TestRunner::notifyDone): (TestRunner::forceImmediateCompletion): (TestRunner::queueLoad): * DumpRenderTree/win/DumpRenderTree.cpp: (runTest): * DumpRenderTree/win/FrameLoadDelegate.cpp: (FrameLoadDelegate::processWork): (FrameLoadDelegate::locationChangeDone): * DumpRenderTree/win/TestRunnerWin.cpp: (TestRunner::notifyDone): (TestRunner::forceImmediateCompletion): (TestRunner::queueLoad): Canonical link: https://commits.webkit.org/205473@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@237099 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-10-15 14:24:49 +00:00
#pragma once
2011-04-26 Gabor Loki <loki@webkit.org> Reviewed by Csaba Osztrogonác. Speeding up SVG filters with multicore (SMP) support https://bugs.webkit.org/show_bug.cgi?id=43903 Some SVG filters execute a huge number of pixel manipulations, which cannot be sped up by graphics accelerators, since their algorithm is too complex. Using the power of Symmetric Multi Processing (SMP) we can split up a task to smaller (data independent) tasks, which can be executed independently. The ParallelJobs framework provides a simple way for distributed programming. The framework is based on WebKit's threading infrastructure, Open Multi-Processing's (OpenMP) API, and libdispatch API. * GNUmakefile.list.am: * JavaScriptCore.vcproj/WTF/WTF.vcproj: * JavaScriptCore.xcodeproj/project.pbxproj: * wtf/CMakeLists.txt: * wtf/ParallelJobs.h: Added. (WTF::ParallelJobs::ParallelJobs): (WTF::ParallelJobs::numberOfJobs): (WTF::ParallelJobs::parameterForJob): (WTF::ParallelJobs::executeJobs): * wtf/ParallelJobsGeneric.cpp: Added. (WTF::ParallelEnvironment::ThreadPrivate::tryLockFor): (WTF::ParallelEnvironment::ThreadPrivate::executeJob): (WTF::ParallelEnvironment::ThreadPrivate::waitForFinish): (WTF::ParallelEnvironment::ThreadPrivate::workerThread): * wtf/ParallelJobsGeneric.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): (WTF::ParallelEnvironment::ThreadPrivate::ThreadPrivate): (WTF::ParallelEnvironment::ThreadPrivate::create): * wtf/ParallelJobsLibdispatch.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): * wtf/ParallelJobsOpenMP.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): * wtf/Platform.h: * wtf/wtf.pri: 2011-04-26 Gabor Loki <loki@webkit.org> Reviewed by Csaba Osztrogonác. Speeding up SVG filters with multicore (SMP) support https://bugs.webkit.org/show_bug.cgi?id=43903 Some SVG filters execute a huge number of pixel manipulations, which cannot be sped up by graphics accelerators, since their algorithm is too complex. Using the power of Symmetric Multi Processing (SMP) we can split up a task to smaller (data independent) tasks, which can be executed independently. The ParallelJobs framework provides a simple way for distributed programming. The framework is based on WebKit's threading infrastructure, Open Multi-Processing's (OpenMP) API, and libdispatch API. * ForwardingHeaders/wtf/ParallelJobs.h: Added. * platform/graphics/filters/FETurbulence.cpp: (WebCore::FETurbulence::PaintingData::PaintingData): (WebCore::FETurbulence::noise2D): (WebCore::FETurbulence::calculateTurbulenceValueForPoint): (WebCore::FETurbulence::fillRegion): (WebCore::FETurbulence::fillRegionWorker): (WebCore::FETurbulence::apply): * platform/graphics/filters/FETurbulence.h: Canonical link: https://commits.webkit.org/74633@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@84911 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2011-04-26 14:40:47 +00:00
#if ENABLE(THREADING_LIBDISPATCH)
#include <dispatch/dispatch.h>
namespace WTF {
class ParallelEnvironment {
WTF_MAKE_FAST_ALLOCATED;
public:
typedef void (*ThreadFunction)(void*);
ParallelEnvironment(ThreadFunction threadFunction, size_t sizeOfParameter, int requestedJobNumber)
: m_threadFunction(threadFunction)
, m_sizeOfParameter(sizeOfParameter)
, m_numberOfJobs(requestedJobNumber)
2011-04-26 Gabor Loki <loki@webkit.org> Reviewed by Csaba Osztrogonác. Speeding up SVG filters with multicore (SMP) support https://bugs.webkit.org/show_bug.cgi?id=43903 Some SVG filters execute a huge number of pixel manipulations, which cannot be sped up by graphics accelerators, since their algorithm is too complex. Using the power of Symmetric Multi Processing (SMP) we can split up a task to smaller (data independent) tasks, which can be executed independently. The ParallelJobs framework provides a simple way for distributed programming. The framework is based on WebKit's threading infrastructure, Open Multi-Processing's (OpenMP) API, and libdispatch API. * GNUmakefile.list.am: * JavaScriptCore.vcproj/WTF/WTF.vcproj: * JavaScriptCore.xcodeproj/project.pbxproj: * wtf/CMakeLists.txt: * wtf/ParallelJobs.h: Added. (WTF::ParallelJobs::ParallelJobs): (WTF::ParallelJobs::numberOfJobs): (WTF::ParallelJobs::parameterForJob): (WTF::ParallelJobs::executeJobs): * wtf/ParallelJobsGeneric.cpp: Added. (WTF::ParallelEnvironment::ThreadPrivate::tryLockFor): (WTF::ParallelEnvironment::ThreadPrivate::executeJob): (WTF::ParallelEnvironment::ThreadPrivate::waitForFinish): (WTF::ParallelEnvironment::ThreadPrivate::workerThread): * wtf/ParallelJobsGeneric.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): (WTF::ParallelEnvironment::ThreadPrivate::ThreadPrivate): (WTF::ParallelEnvironment::ThreadPrivate::create): * wtf/ParallelJobsLibdispatch.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): * wtf/ParallelJobsOpenMP.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): * wtf/Platform.h: * wtf/wtf.pri: 2011-04-26 Gabor Loki <loki@webkit.org> Reviewed by Csaba Osztrogonác. Speeding up SVG filters with multicore (SMP) support https://bugs.webkit.org/show_bug.cgi?id=43903 Some SVG filters execute a huge number of pixel manipulations, which cannot be sped up by graphics accelerators, since their algorithm is too complex. Using the power of Symmetric Multi Processing (SMP) we can split up a task to smaller (data independent) tasks, which can be executed independently. The ParallelJobs framework provides a simple way for distributed programming. The framework is based on WebKit's threading infrastructure, Open Multi-Processing's (OpenMP) API, and libdispatch API. * ForwardingHeaders/wtf/ParallelJobs.h: Added. * platform/graphics/filters/FETurbulence.cpp: (WebCore::FETurbulence::PaintingData::PaintingData): (WebCore::FETurbulence::noise2D): (WebCore::FETurbulence::calculateTurbulenceValueForPoint): (WebCore::FETurbulence::fillRegion): (WebCore::FETurbulence::fillRegionWorker): (WebCore::FETurbulence::apply): * platform/graphics/filters/FETurbulence.h: Canonical link: https://commits.webkit.org/74633@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@84911 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2011-04-26 14:40:47 +00:00
{
// We go with the requested number of jobs. libdispatch will distribute the work optimally.
ASSERT_ARG(requestedJobNumber, requestedJobNumber > 0);
2011-04-26 Gabor Loki <loki@webkit.org> Reviewed by Csaba Osztrogonác. Speeding up SVG filters with multicore (SMP) support https://bugs.webkit.org/show_bug.cgi?id=43903 Some SVG filters execute a huge number of pixel manipulations, which cannot be sped up by graphics accelerators, since their algorithm is too complex. Using the power of Symmetric Multi Processing (SMP) we can split up a task to smaller (data independent) tasks, which can be executed independently. The ParallelJobs framework provides a simple way for distributed programming. The framework is based on WebKit's threading infrastructure, Open Multi-Processing's (OpenMP) API, and libdispatch API. * GNUmakefile.list.am: * JavaScriptCore.vcproj/WTF/WTF.vcproj: * JavaScriptCore.xcodeproj/project.pbxproj: * wtf/CMakeLists.txt: * wtf/ParallelJobs.h: Added. (WTF::ParallelJobs::ParallelJobs): (WTF::ParallelJobs::numberOfJobs): (WTF::ParallelJobs::parameterForJob): (WTF::ParallelJobs::executeJobs): * wtf/ParallelJobsGeneric.cpp: Added. (WTF::ParallelEnvironment::ThreadPrivate::tryLockFor): (WTF::ParallelEnvironment::ThreadPrivate::executeJob): (WTF::ParallelEnvironment::ThreadPrivate::waitForFinish): (WTF::ParallelEnvironment::ThreadPrivate::workerThread): * wtf/ParallelJobsGeneric.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): (WTF::ParallelEnvironment::ThreadPrivate::ThreadPrivate): (WTF::ParallelEnvironment::ThreadPrivate::create): * wtf/ParallelJobsLibdispatch.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): * wtf/ParallelJobsOpenMP.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): * wtf/Platform.h: * wtf/wtf.pri: 2011-04-26 Gabor Loki <loki@webkit.org> Reviewed by Csaba Osztrogonác. Speeding up SVG filters with multicore (SMP) support https://bugs.webkit.org/show_bug.cgi?id=43903 Some SVG filters execute a huge number of pixel manipulations, which cannot be sped up by graphics accelerators, since their algorithm is too complex. Using the power of Symmetric Multi Processing (SMP) we can split up a task to smaller (data independent) tasks, which can be executed independently. The ParallelJobs framework provides a simple way for distributed programming. The framework is based on WebKit's threading infrastructure, Open Multi-Processing's (OpenMP) API, and libdispatch API. * ForwardingHeaders/wtf/ParallelJobs.h: Added. * platform/graphics/filters/FETurbulence.cpp: (WebCore::FETurbulence::PaintingData::PaintingData): (WebCore::FETurbulence::noise2D): (WebCore::FETurbulence::calculateTurbulenceValueForPoint): (WebCore::FETurbulence::fillRegion): (WebCore::FETurbulence::fillRegionWorker): (WebCore::FETurbulence::apply): * platform/graphics/filters/FETurbulence.h: Canonical link: https://commits.webkit.org/74633@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@84911 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2011-04-26 14:40:47 +00:00
}
int numberOfJobs()
{
return m_numberOfJobs;
}
void execute(unsigned char* parameters)
{
static dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2011-04-26 Gabor Loki <loki@webkit.org> Reviewed by Csaba Osztrogonác. Speeding up SVG filters with multicore (SMP) support https://bugs.webkit.org/show_bug.cgi?id=43903 Some SVG filters execute a huge number of pixel manipulations, which cannot be sped up by graphics accelerators, since their algorithm is too complex. Using the power of Symmetric Multi Processing (SMP) we can split up a task to smaller (data independent) tasks, which can be executed independently. The ParallelJobs framework provides a simple way for distributed programming. The framework is based on WebKit's threading infrastructure, Open Multi-Processing's (OpenMP) API, and libdispatch API. * GNUmakefile.list.am: * JavaScriptCore.vcproj/WTF/WTF.vcproj: * JavaScriptCore.xcodeproj/project.pbxproj: * wtf/CMakeLists.txt: * wtf/ParallelJobs.h: Added. (WTF::ParallelJobs::ParallelJobs): (WTF::ParallelJobs::numberOfJobs): (WTF::ParallelJobs::parameterForJob): (WTF::ParallelJobs::executeJobs): * wtf/ParallelJobsGeneric.cpp: Added. (WTF::ParallelEnvironment::ThreadPrivate::tryLockFor): (WTF::ParallelEnvironment::ThreadPrivate::executeJob): (WTF::ParallelEnvironment::ThreadPrivate::waitForFinish): (WTF::ParallelEnvironment::ThreadPrivate::workerThread): * wtf/ParallelJobsGeneric.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): (WTF::ParallelEnvironment::ThreadPrivate::ThreadPrivate): (WTF::ParallelEnvironment::ThreadPrivate::create): * wtf/ParallelJobsLibdispatch.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): * wtf/ParallelJobsOpenMP.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): * wtf/Platform.h: * wtf/wtf.pri: 2011-04-26 Gabor Loki <loki@webkit.org> Reviewed by Csaba Osztrogonác. Speeding up SVG filters with multicore (SMP) support https://bugs.webkit.org/show_bug.cgi?id=43903 Some SVG filters execute a huge number of pixel manipulations, which cannot be sped up by graphics accelerators, since their algorithm is too complex. Using the power of Symmetric Multi Processing (SMP) we can split up a task to smaller (data independent) tasks, which can be executed independently. The ParallelJobs framework provides a simple way for distributed programming. The framework is based on WebKit's threading infrastructure, Open Multi-Processing's (OpenMP) API, and libdispatch API. * ForwardingHeaders/wtf/ParallelJobs.h: Added. * platform/graphics/filters/FETurbulence.cpp: (WebCore::FETurbulence::PaintingData::PaintingData): (WebCore::FETurbulence::noise2D): (WebCore::FETurbulence::calculateTurbulenceValueForPoint): (WebCore::FETurbulence::fillRegion): (WebCore::FETurbulence::fillRegionWorker): (WebCore::FETurbulence::apply): * platform/graphics/filters/FETurbulence.h: Canonical link: https://commits.webkit.org/74633@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@84911 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2011-04-26 14:40:47 +00:00
dispatch_apply(m_numberOfJobs, globalQueue, ^(size_t i) { (*m_threadFunction)(parameters + (m_sizeOfParameter * i)); });
2011-04-26 Gabor Loki <loki@webkit.org> Reviewed by Csaba Osztrogonác. Speeding up SVG filters with multicore (SMP) support https://bugs.webkit.org/show_bug.cgi?id=43903 Some SVG filters execute a huge number of pixel manipulations, which cannot be sped up by graphics accelerators, since their algorithm is too complex. Using the power of Symmetric Multi Processing (SMP) we can split up a task to smaller (data independent) tasks, which can be executed independently. The ParallelJobs framework provides a simple way for distributed programming. The framework is based on WebKit's threading infrastructure, Open Multi-Processing's (OpenMP) API, and libdispatch API. * GNUmakefile.list.am: * JavaScriptCore.vcproj/WTF/WTF.vcproj: * JavaScriptCore.xcodeproj/project.pbxproj: * wtf/CMakeLists.txt: * wtf/ParallelJobs.h: Added. (WTF::ParallelJobs::ParallelJobs): (WTF::ParallelJobs::numberOfJobs): (WTF::ParallelJobs::parameterForJob): (WTF::ParallelJobs::executeJobs): * wtf/ParallelJobsGeneric.cpp: Added. (WTF::ParallelEnvironment::ThreadPrivate::tryLockFor): (WTF::ParallelEnvironment::ThreadPrivate::executeJob): (WTF::ParallelEnvironment::ThreadPrivate::waitForFinish): (WTF::ParallelEnvironment::ThreadPrivate::workerThread): * wtf/ParallelJobsGeneric.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): (WTF::ParallelEnvironment::ThreadPrivate::ThreadPrivate): (WTF::ParallelEnvironment::ThreadPrivate::create): * wtf/ParallelJobsLibdispatch.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): * wtf/ParallelJobsOpenMP.h: Added. (WTF::ParallelEnvironment::ParallelEnvironment): (WTF::ParallelEnvironment::numberOfJobs): (WTF::ParallelEnvironment::parameterForJob): (WTF::ParallelEnvironment::executeJobs): * wtf/Platform.h: * wtf/wtf.pri: 2011-04-26 Gabor Loki <loki@webkit.org> Reviewed by Csaba Osztrogonác. Speeding up SVG filters with multicore (SMP) support https://bugs.webkit.org/show_bug.cgi?id=43903 Some SVG filters execute a huge number of pixel manipulations, which cannot be sped up by graphics accelerators, since their algorithm is too complex. Using the power of Symmetric Multi Processing (SMP) we can split up a task to smaller (data independent) tasks, which can be executed independently. The ParallelJobs framework provides a simple way for distributed programming. The framework is based on WebKit's threading infrastructure, Open Multi-Processing's (OpenMP) API, and libdispatch API. * ForwardingHeaders/wtf/ParallelJobs.h: Added. * platform/graphics/filters/FETurbulence.cpp: (WebCore::FETurbulence::PaintingData::PaintingData): (WebCore::FETurbulence::noise2D): (WebCore::FETurbulence::calculateTurbulenceValueForPoint): (WebCore::FETurbulence::fillRegion): (WebCore::FETurbulence::fillRegionWorker): (WebCore::FETurbulence::apply): * platform/graphics/filters/FETurbulence.h: Canonical link: https://commits.webkit.org/74633@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@84911 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2011-04-26 14:40:47 +00:00
}
private:
ThreadFunction m_threadFunction;
size_t m_sizeOfParameter;
int m_numberOfJobs;
};
} // namespace WTF
#endif // ENABLE(THREADING_LIBDISPATCH)