Fix T53068: AMD Threadripper not working well with Blender
The issue was caused by SpinLock implementation in old pthreads we ar eusing on Windows. Using newer one (2.10-rc) demonstrates same exact behavior. But likely using own atomics and memory barrier based implementation solves the issue. A bit annoying that we need to change such a core part of Blender just to make specific CPU happy, but it's better to have artists happy on all computers. There is no expected downsides of this change, but it is so called "works for me" category. Let's see how it all goes.
This commit is contained in:
parent
7adc698eed
commit
55696b56d9
Notes:
blender-bot
2023-02-14 06:28:51 +01:00
Referenced by issue #54807, Blender performance under Linux is flakey ( on my system? ) Referenced by issue #53683, 2.79a release Referenced by issue #53068, AMD Threadripper not working well with Blender
|
@ -111,8 +111,10 @@ void BLI_mutex_unlock(ThreadMutex *mutex);
|
|||
|
||||
/* Spin Lock */
|
||||
|
||||
#ifdef __APPLE__
|
||||
typedef OSSpinLock SpinLock;
|
||||
#if defined(__APPLE__)
|
||||
typedef OSSpinLock ;
|
||||
#elif defined(_MSC_VER)
|
||||
typedef volatile int SpinLock;
|
||||
#else
|
||||
typedef pthread_spinlock_t SpinLock;
|
||||
#endif
|
||||
|
|
|
@ -472,8 +472,10 @@ void BLI_mutex_free(ThreadMutex *mutex)
|
|||
|
||||
void BLI_spin_init(SpinLock *spin)
|
||||
{
|
||||
#ifdef __APPLE__
|
||||
#if defined(__APPLE__)
|
||||
*spin = OS_SPINLOCK_INIT;
|
||||
#elif defined(_MSC_VER)
|
||||
*spin = 0;
|
||||
#else
|
||||
pthread_spin_init(spin, 0);
|
||||
#endif
|
||||
|
@ -481,8 +483,14 @@ void BLI_spin_init(SpinLock *spin)
|
|||
|
||||
void BLI_spin_lock(SpinLock *spin)
|
||||
{
|
||||
#ifdef __APPLE__
|
||||
#if defined(__APPLE__)
|
||||
OSSpinLockLock(spin);
|
||||
#elif defined(_MSC_VER)
|
||||
while (InterlockedExchangeAcquire(spin, 1)) {
|
||||
while (*spin) {
|
||||
/* pass */
|
||||
}
|
||||
}
|
||||
#else
|
||||
pthread_spin_lock(spin);
|
||||
#endif
|
||||
|
@ -490,23 +498,24 @@ void BLI_spin_lock(SpinLock *spin)
|
|||
|
||||
void BLI_spin_unlock(SpinLock *spin)
|
||||
{
|
||||
#ifdef __APPLE__
|
||||
#if defined(__APPLE__)
|
||||
OSSpinLockUnlock(spin);
|
||||
#elif defined(_MSC_VER)
|
||||
_ReadWriteBarrier();
|
||||
*spin = 0;
|
||||
#else
|
||||
pthread_spin_unlock(spin);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef __APPLE__
|
||||
void BLI_spin_end(SpinLock *spin)
|
||||
{
|
||||
pthread_spin_destroy(spin);
|
||||
}
|
||||
#if defined(__APPLE__)
|
||||
#elif defined(_MSC_VER)
|
||||
#else
|
||||
void BLI_spin_end(SpinLock *UNUSED(spin))
|
||||
{
|
||||
}
|
||||
pthread_spin_destroy(spin);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Read/Write Mutex Lock */
|
||||
|
||||
|
|
Loading…
Reference in New Issue