implement barrier/critical section for OSX (PosixThreadSupport)
enable Demos/ThreadingDemo for OSX add cmake build support for VectorAdd_OpenCL for OSX
This commit is contained in:
@@ -111,9 +111,6 @@ IF(WIN32)
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
OPTION(BUILD_MINICL_OPENCL_DEMOS "Build OpenCL demos for MiniCL (Generic CPU)" OFF)
|
|
||||||
|
|
||||||
OPTION(BUILD_CPU_DEMOS "Build original Bullet CPU demos" ON)
|
|
||||||
|
|
||||||
|
|
||||||
IF (INTERNAL_CREATE_MSVC_RELATIVE_PATH_PROJECTFILES)
|
IF (INTERNAL_CREATE_MSVC_RELATIVE_PATH_PROJECTFILES)
|
||||||
@@ -123,6 +120,12 @@ ENDIF(INTERNAL_CREATE_MSVC_RELATIVE_PATH_PROJECTFILES)
|
|||||||
|
|
||||||
ENDIF (WIN32)
|
ENDIF (WIN32)
|
||||||
|
|
||||||
|
OPTION(BUILD_MINICL_OPENCL_DEMOS "Build OpenCL demos for MiniCL (Generic CPU)" ON)
|
||||||
|
|
||||||
|
OPTION(BUILD_CPU_DEMOS "Build original Bullet CPU demos" ON)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
OPTION(INTERNAL_UPDATE_SERIALIZATION_STRUCTURES "Internal update serialization structures" OFF)
|
OPTION(INTERNAL_UPDATE_SERIALIZATION_STRUCTURES "Internal update serialization structures" OFF)
|
||||||
IF (INTERNAL_UPDATE_SERIALIZATION_STRUCTURES)
|
IF (INTERNAL_UPDATE_SERIALIZATION_STRUCTURES)
|
||||||
ADD_DEFINITIONS( -DBT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES)
|
ADD_DEFINITIONS( -DBT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
INCLUDE_DIRECTORIES(
|
INCLUDE_DIRECTORIES(
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/src
|
${BULLET_PHYSICS_SOURCE_DIR}/src
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/Extras/OpenCL/Shared
|
${BULLET_PHYSICS_SOURCE_DIR}/Demos/SharedOpenCL
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL
|
${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -42,15 +42,15 @@ IF (USE_GLUT)
|
|||||||
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/btParticlesSharedDefs.h
|
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/btParticlesSharedDefs.h
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/btParticlesSharedTypes.h
|
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/btParticlesSharedTypes.h
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/ParticlesDemo.h
|
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/ParticlesDemo.h
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/btOclUtils.h
|
${BULLET_PHYSICS_SOURCE_DIR}/Demos/SharedOpenCL/btOclUtils.h
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/shaders.h
|
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/shaders.h
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/Extras/OpenCL/Shared/btOclCommon.h
|
${BULLET_PHYSICS_SOURCE_DIR}/Demos/SharedOpenCL/btOclCommon.h
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/btOclUtils.cpp
|
${BULLET_PHYSICS_SOURCE_DIR}/Demos/SharedOpenCL/btOclUtils.cpp
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/btParticlesDemoDynamicsWorld.cpp
|
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/btParticlesDemoDynamicsWorld.cpp
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/main.cpp
|
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/main.cpp
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/ParticlesDemo.cpp
|
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/ParticlesDemo.cpp
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/shaders.cpp
|
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/shaders.cpp
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/Extras/OpenCL/Shared/btOclCommon.cpp
|
${BULLET_PHYSICS_SOURCE_DIR}/Demos/SharedOpenCL/btOclCommon.cpp
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/ParticlesOCL.cl
|
${BULLET_PHYSICS_SOURCE_DIR}/Demos/ParticlesOpenCL/ParticlesOCL.cl
|
||||||
)
|
)
|
||||||
ELSE (USE_GLUT)
|
ELSE (USE_GLUT)
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ SET(GLUT_ROOT ${BULLET_PHYSICS_SOURCE_DIR}/Glut)
|
|||||||
########################################################
|
########################################################
|
||||||
|
|
||||||
#currently this demo has only been tested under Windows 32bit
|
#currently this demo has only been tested under Windows 32bit
|
||||||
IF (WIN32)
|
#IF (WIN32)
|
||||||
|
|
||||||
INCLUDE_DIRECTORIES(
|
INCLUDE_DIRECTORIES(
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL
|
${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL
|
||||||
@@ -42,4 +42,4 @@ IF (INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES)
|
|||||||
SET_TARGET_PROPERTIES(AppThreadingDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo")
|
SET_TARGET_PROPERTIES(AppThreadingDemo PROPERTIES RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo")
|
||||||
ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES)
|
ENDIF(INTERNAL_ADD_POSTFIX_EXECUTABLE_NAMES)
|
||||||
|
|
||||||
ENDIF(WIN32)
|
#ENDIF(WIN32)
|
||||||
|
|||||||
@@ -20,8 +20,40 @@ subject to the following restrictions:
|
|||||||
/// June 2010
|
/// June 2010
|
||||||
/// New: critical section/barriers and non-blocking pollingn for completion, currently Windows only
|
/// New: critical section/barriers and non-blocking pollingn for completion, currently Windows only
|
||||||
|
|
||||||
|
void SampleThreadFunc(void* userPtr,void* lsMemory);
|
||||||
|
void* SamplelsMemoryFunc();
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include "BulletMultiThreaded/PosixThreadSupport.h"
|
||||||
|
|
||||||
|
btThreadSupportInterface* createThreadSupport(int numThreads)
|
||||||
|
{
|
||||||
|
PosixThreadSupport::ThreadConstructionInfo constructionInfo("testThreads",
|
||||||
|
SampleThreadFunc,
|
||||||
|
SamplelsMemoryFunc,
|
||||||
|
numThreads);
|
||||||
|
btThreadSupportInterface* threadSupport = new PosixThreadSupport(constructionInfo);
|
||||||
|
|
||||||
|
return threadSupport;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#elif defined( _WIN32)
|
||||||
#include "BulletMultiThreaded/Win32ThreadSupport.h"
|
#include "BulletMultiThreaded/Win32ThreadSupport.h"
|
||||||
|
|
||||||
|
btThreadSupportInterface* createThreadSupport(int numThreads)
|
||||||
|
{
|
||||||
|
Win32ThreadSupport::Win32ThreadConstructionInfo threadConstructionInfo("testThreads",SampleThreadFunc,SamplelsMemoryFunc,numThreads);
|
||||||
|
Win32ThreadSupport* threadSupport = new Win32ThreadSupport(threadConstructionInfo);
|
||||||
|
return threadSupport;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
struct SampleArgs
|
struct SampleArgs
|
||||||
{
|
{
|
||||||
btCriticalSection* m_cs;
|
btCriticalSection* m_cs;
|
||||||
@@ -64,19 +96,26 @@ void* SamplelsMemoryFunc()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc,char** argv)
|
int main(int argc,char** argv)
|
||||||
{
|
{
|
||||||
int numThreads = 4;
|
int numThreads = 4;
|
||||||
|
|
||||||
Win32ThreadSupport::Win32ThreadConstructionInfo threadConstructionInfo("testThreads",SampleThreadFunc,SamplelsMemoryFunc,numThreads);
|
btThreadSupportInterface* threadSupport = createThreadSupport(numThreads);
|
||||||
|
|
||||||
Win32ThreadSupport* threadSupport = new Win32ThreadSupport(threadConstructionInfo);
|
|
||||||
|
|
||||||
threadSupport->startSPU();
|
threadSupport->startSPU();
|
||||||
|
|
||||||
for (int i=0;i<threadSupport->getNumTasks();i++)
|
for (int i=0;i<threadSupport->getNumTasks();i++)
|
||||||
{
|
{
|
||||||
SampleThreadLocalStorage* storage = (SampleThreadLocalStorage*)threadSupport->getThreadLocalMemory(i);
|
SampleThreadLocalStorage* storage = (SampleThreadLocalStorage*)threadSupport->getThreadLocalMemory(i);
|
||||||
|
btAssert(storage);
|
||||||
storage->threadId = i;
|
storage->threadId = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +132,7 @@ int main(int argc,char** argv)
|
|||||||
threadSupport->sendRequest(1, (ppu_address_t) &args, i);
|
threadSupport->sendRequest(1, (ppu_address_t) &args, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool blockingWait = false;
|
bool blockingWait =true;
|
||||||
if (blockingWait)
|
if (blockingWait)
|
||||||
{
|
{
|
||||||
for (i=0;i<numThreads;i++)
|
for (i=0;i<numThreads;i++)
|
||||||
@@ -102,6 +141,7 @@ int main(int argc,char** argv)
|
|||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
int numActiveThreads = numThreads;
|
int numActiveThreads = numThreads;
|
||||||
while (numActiveThreads)
|
while (numActiveThreads)
|
||||||
{
|
{
|
||||||
@@ -115,6 +155,7 @@ int main(int argc,char** argv)
|
|||||||
printf("polling\n");
|
printf("polling\n");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
threadSupport->stopSPU();
|
threadSupport->stopSPU();
|
||||||
|
|||||||
25
Demos/VectorAdd_OpenCL/Apple/CMakeLists.txt
Normal file
25
Demos/VectorAdd_OpenCL/Apple/CMakeLists.txt
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# AppVectorAdd is a very basic test OpenCL/MiniCL.
|
||||||
|
|
||||||
|
IF (APPLE)
|
||||||
|
FIND_LIBRARY(OPENCL_LIBRARY OpenCL DOC "OpenCL lib for OSX")
|
||||||
|
FIND_PATH(OPENCL_INCLUDE_DIR OpenCL/cl.h DOC "Include for OpenCL on OSX")
|
||||||
|
ENDIF (APPLE)
|
||||||
|
|
||||||
|
|
||||||
|
INCLUDE_DIRECTORIES(
|
||||||
|
${BULLET_PHYSICS_SOURCE_DIR}/src
|
||||||
|
)
|
||||||
|
|
||||||
|
LINK_LIBRARIES(
|
||||||
|
LinearMath ${OPENCL_LIBRARY}
|
||||||
|
)
|
||||||
|
|
||||||
|
ADD_EXECUTABLE(AppVectorAdd_Apple
|
||||||
|
../MiniCL_VectorAdd.cpp
|
||||||
|
../VectorAddKernels.cl
|
||||||
|
)
|
||||||
|
|
||||||
|
IF (UNIX)
|
||||||
|
TARGET_LINK_LIBRARIES(AppVectorAdd_Apple pthread)
|
||||||
|
ENDIF(UNIX)
|
||||||
|
|
||||||
@@ -245,5 +245,143 @@ void PosixThreadSupport::stopSPU()
|
|||||||
m_activeSpuStatus.clear();
|
m_activeSpuStatus.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class PosixCriticalSection : public btCriticalSection
|
||||||
|
{
|
||||||
|
pthread_mutex_t m_mutex;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PosixCriticalSection()
|
||||||
|
{
|
||||||
|
pthread_mutex_init(&m_mutex, NULL);
|
||||||
|
}
|
||||||
|
virtual ~PosixCriticalSection()
|
||||||
|
{
|
||||||
|
pthread_mutex_destroy(&m_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
ATTRIBUTE_ALIGNED16(unsigned int mCommonBuff[32]);
|
||||||
|
|
||||||
|
virtual unsigned int getSharedParam(int i)
|
||||||
|
{
|
||||||
|
return mCommonBuff[i];
|
||||||
|
}
|
||||||
|
virtual void setSharedParam(int i,unsigned int p)
|
||||||
|
{
|
||||||
|
mCommonBuff[i] = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void lock()
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&m_mutex);
|
||||||
|
}
|
||||||
|
virtual void unlock()
|
||||||
|
{
|
||||||
|
pthread_mutex_unlock(&m_mutex);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(_POSIX_BARRIERS) && (_POSIX_BARRIERS - 20012L) >= 0
|
||||||
|
/* OK to use barriers on this platform */
|
||||||
|
class PosixBarrier : public btBarrier
|
||||||
|
{
|
||||||
|
pthread_barrier_t m_barr;
|
||||||
|
int m_numThreads;
|
||||||
|
public:
|
||||||
|
PosixBarrier()
|
||||||
|
:m_numThreads(0) { }
|
||||||
|
virtual ~PosixBarrier() {
|
||||||
|
pthread_barrier_destroy(&m_barr);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void sync()
|
||||||
|
{
|
||||||
|
int rc = pthread_barrier_wait(&m_barr);
|
||||||
|
if(rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD)
|
||||||
|
{
|
||||||
|
printf("Could not wait on barrier\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
virtual void setMaxCount(int numThreads)
|
||||||
|
{
|
||||||
|
int result = pthread_barrier_init(&m_barr, NULL, numThreads);
|
||||||
|
m_numThreads = numThreads;
|
||||||
|
btAssert(result==0);
|
||||||
|
}
|
||||||
|
virtual int getMaxCount()
|
||||||
|
{
|
||||||
|
return m_numThreads;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
/* Not OK to use barriers on this platform - insert alternate code here */
|
||||||
|
class PosixBarrier : public btBarrier
|
||||||
|
{
|
||||||
|
pthread_mutex_t m_mutex;
|
||||||
|
pthread_cond_t m_cond;
|
||||||
|
|
||||||
|
int m_numThreads;
|
||||||
|
int m_called;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PosixBarrier()
|
||||||
|
:m_numThreads(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
virtual ~PosixBarrier()
|
||||||
|
{
|
||||||
|
if (m_numThreads>0)
|
||||||
|
{
|
||||||
|
pthread_mutex_destroy(&m_mutex);
|
||||||
|
pthread_cond_destroy(&m_cond);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void sync()
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&m_mutex);
|
||||||
|
m_called++;
|
||||||
|
if (m_called == m_numThreads) {
|
||||||
|
m_called = 0;
|
||||||
|
pthread_cond_broadcast(&m_cond);
|
||||||
|
} else {
|
||||||
|
pthread_cond_wait(&m_cond,&m_mutex);
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&m_mutex);
|
||||||
|
|
||||||
|
}
|
||||||
|
virtual void setMaxCount(int numThreads)
|
||||||
|
{
|
||||||
|
if (m_numThreads>0)
|
||||||
|
{
|
||||||
|
pthread_mutex_destroy(&m_mutex);
|
||||||
|
pthread_cond_destroy(&m_cond);
|
||||||
|
}
|
||||||
|
m_called = 0;
|
||||||
|
pthread_mutex_init(&m_mutex,NULL);
|
||||||
|
pthread_cond_init(&m_cond,NULL);
|
||||||
|
m_numThreads = numThreads;
|
||||||
|
}
|
||||||
|
virtual int getMaxCount()
|
||||||
|
{
|
||||||
|
return m_numThreads;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif//_POSIX_BARRIERS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
btBarrier* PosixThreadSupport::createBarrier()
|
||||||
|
{
|
||||||
|
return new PosixBarrier();
|
||||||
|
}
|
||||||
|
|
||||||
|
btCriticalSection* PosixThreadSupport::createCriticalSection()
|
||||||
|
{
|
||||||
|
return new PosixCriticalSection();
|
||||||
|
}
|
||||||
|
|
||||||
#endif // USE_PTHREADS
|
#endif // USE_PTHREADS
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ subject to the following restrictions:
|
|||||||
#include "PlatformDefinitions.h"
|
#include "PlatformDefinitions.h"
|
||||||
|
|
||||||
#ifdef USE_PTHREADS //platform specific defines are defined in PlatformDefinitions.h
|
#ifdef USE_PTHREADS //platform specific defines are defined in PlatformDefinitions.h
|
||||||
|
#define _XOPEN_SOURCE 600 //for definition of pthread_barrier_t, see http://pages.cs.wisc.edu/~travitch/pthreads_primer.html
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <semaphore.h>
|
#include <semaphore.h>
|
||||||
|
|
||||||
@@ -117,6 +118,16 @@ public:
|
|||||||
{
|
{
|
||||||
return m_activeSpuStatus.size();
|
return m_activeSpuStatus.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual btBarrier* createBarrier();
|
||||||
|
|
||||||
|
virtual btCriticalSection* createCriticalSection();
|
||||||
|
|
||||||
|
virtual void* getThreadLocalMemory(int taskId)
|
||||||
|
{
|
||||||
|
return m_activeSpuStatus[taskId].m_lsMemory;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // POSIX_THREAD_SUPPORT_H
|
#endif // POSIX_THREAD_SUPPORT_H
|
||||||
|
|||||||
@@ -77,6 +77,8 @@ public:
|
|||||||
|
|
||||||
virtual btCriticalSection* createCriticalSection() = 0;
|
virtual btCriticalSection* createCriticalSection() = 0;
|
||||||
|
|
||||||
|
virtual void* getThreadLocalMemory(int taskId) { return 0; }
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //THREAD_SUPPORT_INTERFACE_H
|
#endif //THREAD_SUPPORT_INTERFACE_H
|
||||||
|
|||||||
Reference in New Issue
Block a user