Jump to content

Skyrim Multithreading tests on a 3960X Hexacore @ 4.65Ghz


SMB92

Recommended Posts

Seems this is a popular subject, and there have been many questions about this, I figured I'd start a thread with my findings for my CPU. As can be seen in my sig, I run a 6-core 3960X CPU clocked to 4.65Ghz. I can tell you now that this does not mean I get dream performance. Many questions about why Skyrim cannot perform up to standard can be answered quite simply - DirectX 9 is not designed for multi-threading. That being said, there are some settings that would seem to imply that they would help with multi-threading. The main ones being:

 

iNumHWThreads
iHWThread6
iHWThread5
iHWThread4
iHWThread3
iHWThread2
iHWThread1
iAIThread2HWThread
iAIThread1HWThread
iRenderingThread2HWThread
iRenderingThread1HWThread
Furthermore, there is a setting in Nvidia's control panel called "Threaded Optimization". This apparently helps applications to "take advantage of multple CPUs", however it is recommended off for older applications. Why is this relevant? Well perhaps any DirectX 9 application should be considered old. With that said, I will test all my MTing settings with and without this setting enabled and I will document it each time.
The rest of the multi-threading tweaks are irrelevant to me (well for this test anyway, because everyone probably has them on), as I'm only trying to get better performance from the renderer, which was always a long shot with DX9 anyway. So without further adieu, lets get to testing these settings.
The INI setup: I have enhanced my own INIs to my own tastes, a bit above Ultra settings. Note that I play at a ugrids of 7 despite recommendations, and have done so for 2 years. That being said, there is a reason why I do. I find that with a ugrids of 5, not only do I get a buttload of terrible pop-in as I walk by places, especially open areas like Whiterun plains, I find that this always introduces a "frame-spike" or 1-2 second stutter, which is inevitably caused by the CPU having to suddenly render all those popped in objects. Now while I can't avoid pop-in everywhere, I can minimize the visible distance of it by increasing the ugrids, but also there is also a performance reason where this can be effective - ENB includes an "Occlusion Culling" feature. What i find is that, if I'm in a dense area per say, such as the Falkreath Hold, that if everything is loaded past what my eye can see, or more specifically what is shown in a scene, the loading transition becomes much less of a stutter-funk as most things are loaded already, but not specifically rendered. Whether that logic is really just placebo has been proven to me otherwise by playing many hours of the game. In Falkreath in particular, I get minimal stutter from load at ugrids 5, however I get even less so at 7. Now there is a catch - the overall FPS of some scenes goes down. So in Whiterun specifically for example, I get between 45-52 FPS outdoors around the city. With ugrids at 5 I get 55-60. While I do get generally smoother grid transitions, it doesn't completely rule out the "frame-spikes" from loading, but it sure as hell seems to me to be a lot smoother in general.
You may view my INIs here: (Note that I have removed the above MT settings)
Skyrim.ini

[General]
sLanguage=ENGLISH
iLargeIntRefCount=262144
iPreloadSizeLimit=104857600
sIntroSequence=DISABLED.BIK
uGridsToLoad=7
uExterior Cell Buffer=36
bLoadLooseFiles=1
bRunHighLevelProcess=1
bMultiThreadMovement=1
bUseThreadedParticleSystem=1
bUseThreadedBlood=1
bUseThreadedMorpher=1
bUseThreadedTempEffects=1
bUseThreadedTextures=1
bUseThreadedMeshes=1
bUseThreadedLOD=1
bUseThreadedAI=1
bUseHardDriveCache=1
fFlickeringLightDistance=8192
[backgroundLoad]
bUseBackgroundFileLoader=1
bUseMultiThreadedFaceGen=1
bBackgroundCellLoads=1
bUseMultiThreadedTrees=1
bUseBackgroundFileLoader=1
bBackgroundLoadLipFiles=1
[Display]
fDefaultWorldFOV=75
fDefault1stPersonFOV=75
fSunShadowUpdateTime=0.01
fSunUpdateThreshold=0.0250
fShadowLODMaxStartFade=200.0
fSpecularLODMaxStartFade=3000.0
fLightLODMaxStartFade=8192.0
iShadowMapResolutionPrimary=4096
bShadowsOnGrass=1
bPerPixelLighting=1
bAllowScreenshot=1
bSimpleLighting=0
fDecalLifetime=56.5000
iAdapter=0
iPresentInterval=1
[Audio]
fMusicDuckingSeconds=6.0
fMusicUnDuckingSeconds=8.0
fMenuModeFadeOutTime=3.0
fMenuModeFadeInTime=1.0
[Grass]
bAllowCreateGrass=1
bAllowLoadGrass=0
bGrassPointLighting=1
b30GrassVS=1
iMaxGrassTypesPerTexure=15
iMinGrassSize=75 //<-- change this to 75 or higher, if you use grass on steroids.

[GeneralWarnings]
SGeneralMasterMismatchWarning=One or more plugins could not find the correct versions of the master files they depend on. Errors may occur during load or game play. Check the "Warnings.txt" file for more information.

[Archive]
sResourceArchiveList=Skyrim - Misc.bsa, Skyrim - Shaders.bsa, Skyrim - Textures.bsa, Skyrim - Interface.bsa, Skyrim - Animations.bsa, Skyrim - Meshes.bsa, Skyrim - Sounds.bsa
sResourceArchiveList2=Skyrim - Voices.bsa, Skyrim - VoicesExtra.bsa

[Combat]
fMagnetismStrafeHeadingMult=0.0
fMagnetismCombatMult=0.0
fMagnetismMult=0.0
fMagnetismLookingMult=0.0
f1PArrowTiltUpAngle=0.8
f3PArrowTiltUpAngle=0.8
[Papyrus]
fUpdateBudgetMS=1.2
fExtraTaskletBudgetMS=1.2
fPostLoadUpdateTimeMS=500.0
iMinMemoryPageSize=128
iMaxMemoryPageSize=512
iMaxAllocatedMemoryBytes=76800
bEnableLogging=0
bEnableTrace=0
bLoadDebugInformation=0
[Water]
iWaterReflectHeight=2048
iWaterReflectWidth=2048
bUseWaterDisplacements=1
bUseWaterRefractions=1
bUseWaterReflections=1
bUseWaterDepth=1
bUseWaterReflectionBlur=1
bReflectExplosions=1
iWaterBlurAmount=4
bAutoWaterSilhouetteReflections=1
bForceHighDetailReflections=0
bUseWaterHiRes=1
bUseWaterLOD=1
bReflectLODObjects=1
bReflectLODLand=1
bReflectSky=1
bReflectLODTrees=1
bUseWaterShader=1
[Trees]
bForceFullDetail=1
bEnableTreeAnimations=1
[Actor]
fVisibleNavmeshMoveDist=12288.0000
[TerrainManager]
bKeepLowDetailTerrain=0
[Controls]
bMouseAcceleration=0
[HAVOK]
iNumThreads=2
[saveGame]
bAllowProfileTransfer=1
bUseSaveGameHistory=1
[Decals]
bDecalMultithreaded=1
bForceAllDecals=1
[imagespace]
bDoRadialBlur=1
[LightingShader]
fDecalLODFadeEnd=1.0000
fDecalLODFadeStart=1.0000
[Animation]
fAnimInterpFarDist=10500.0000
fAnimInterpNearDist=10000.0000

[interface]
fBookOpenTime=200.0000

SkyrimPrefs.ini

[General]
fBrightLightColorB=1.0000
fBrightLightColorG=1.0000
fBrightLightColorR=1.0000
iStoryManagerLoggingEvent=-1
bEnableStoryManagerLogging=0
fDefaultFOV=75
[imagespace]
bDoDepthOfField=1
iRadialBlurLevel=3
[Display]
iBlurDeferredShadowMask=3
fInteriorShadowDistance=3000.0000
fShadowDistance=4000
iShadowMapResolutionSecondary=2048
iShadowMapResolutionPrimary=4096
iShadowSplitCount=2
iMaxAnisotropy=0
fLeafAnimDampenDistEnd=6000.0000
fLeafAnimDampenDistStart=4600.0000
fTreesMidLODSwitchDist=9999999.0000
bAllow30HairShader=1
iTexMipMapMinimum=4
iTexMipMap=4096
iTexMipMapSkip=0
iUseTexHiRes=1
iNormalMapQuality=4096
iTexNormalMapMinimum=4
iTexMipMapResolution=4096
iTexMipMapQuality=4096
iMipMapResolution=4096
iMipMapSize=4096
bFaceMipMaps=1
bFaceGenTexturing=1
bFaceGenTexturingQuality=4096
bHighQualityTexMipMaps=1
bDynamicWindowReflections=1
fGamma=1.0000
iShadowFilter=4
fDecalLOD2=1500.0000
fDecalLOD1=1000.0000
iActorShadowCountInt=12
iActorShadowCountExt=20
fSpecularLODStartFade=4096
fShadowLODStartFade=200.0000
fLightLODStartFade=8192.0000
bTransparencyMultisampling=0
iWaterMultiSamples=0
iMultiSample=0
iShadowMode=4
bTreesReceiveShadows=1
bDrawLandShadows=1
bDrawShadows=1
bDeferredShadows=1
bFull Screen=1
iSize H=1080
iSize W=1920
fMeshLODFadePercentDefault=1.2000
fMeshLODFadeBoundDefault=256.0000
fMeshLODLevel2FadeTreeDistance=1000000.0000
fMeshLODLevel1FadeTreeDistance=1000000.0000
fMeshLODLevel2FadeDist=1e+007
fMeshLODLevel1FadeDist=1e+007
bShadowMaskZPrepass=0
bMainZPrepass=0
iMaxSkinDecalsPerFrame=25
iMaxDecalsPerFrame=100
sD3DDevice="NVIDIA GeForce GTX 980 Ti" <--- change to your card!
bFXAAEnabled=0
iShadowMapResolution=4096
fShadowBiasScale=0.15
iShadowMaskQuarter=4
bFloatPointRenderTarget=1
iScreenShotIndex=203
bShadowsOnGrass=1
[Grass]
b30GrassVS=1
fGrassStartFadeDistance=9000
fGrassMaxStartFadeDistance=11000.0000
fGrassMinStartFadeDistance=0.0000
[MAIN]
bGamepadEnable=0
bCrosshairEnabled=1
fHUDOpacity=1.0000
bSaveOnPause=0
bSaveOnTravel=0
bSaveOnWait=0
bSaveOnRest=0
fSkyCellRefFadeDistance=150000.0000
[GamePlay]
bShowFloatingQuestMarkers=1
bShowQuestMarkers=1
iDifficulty=3
[interface]
bDialogueSubtitles=1
bGeneralSubtitles=1
fMouseCursorSpeed=1.0000
bShowCompass=1
[Controls]
fGamepadHeadingSensitivity=1.0000
fMouseHeadingSensitivity=0.0500
bAlwaysRunByDefault=1
bInvertYValues=0
bGamePadRumble=1
bMouseAcceleration=0
bUseKinect=0
[Particles]
iMaxDesired=750
[saveGame]
fAutosaveEveryXMins=60.0000
[AudioMenu]
fAudioMasterVolume=1.0000
fVal7=1.0000
uID7=1778591256
fVal6=1.0000
uID6=1778589878
fVal5=1.0000
uID5=3954
fVal4=1.0000
uID4=654727281
fVal3=1.0000
uID3=94881
fVal2=0.3000
uID2=466532
fVal1=0.8000
uID1=554685
fVal0=1.0000
uID0=1007612
[Clouds]
fCloudLevel2Distance=262144.0000
fCloudLevel1Distance=32768.0000
fCloudLevel0Distance=16384.0000
fNearDistance=25.0000
fCloudNearFadeDistance=9000.0000
[TerrainManager]
fTreeLoadDistance=125000
fBlockMaximumDistance=250000
fBlockLevel1Distance=100000
fBlockLevel0Distance=50000
fSplitDistanceMult=2.0
bShowLODInEditor=0
fCloudNearFadeDistance=9000.0000
[NavMesh]
fObstacleAlpha=0.5000
fCoverSideHighAlpha=0.8000
fCoverSideLowAlpha=0.6500
fEdgeFullAlpha=1.0000
fEdgeHighAlpha=0.7500
fEdgeLowAlpha=0.5000
fTriangleFullAlpha=0.7000
fTriangleHighAlpha=0.3500
fTriangleLowAlpha=0.2000
fLedgeBoxHalfHeight=25.0000
fEdgeDistFromVert=10.0000
fEdgeThickness=10.0000
fPointSize=2.5000
bUseThreadedMeshes=1
[Trees]
bRenderSkinnedTrees=1
uiMaxSkinnedTreesToRender=50
bUseMultiThreadedTrees=1
bEnableTreeAnimations=1
[Decals]
uMaxDecals=1000
bDecals=1
bSkinnedDecals=1
uMaxSkinDecals=100
uMaxSkinDecalsPerActor=60
[LOD]
fLODFadeOutMultObjects=15.000
fLODFadeOutMultItems=15.000
fLODFadeOutMultActors=15.000
fLODFadeOutMultSkyCell=1.0000
[Launcher]
bEnableFileSelection=1
bShowAllResolutions=1
uLastAspectRatio=3
[blurShaderHDR]
bDoHighDynamicRange=1
[blurShader]
bUseBlurShader=1
[HAVOK]
iNumThreads=2
[Water]
iWaterReflectHeight=1024
iWaterReflectWidth=1024
bUseWaterDisplacements=1
bUseWaterRefractions=1
bUseWaterReflections=1
bUseWaterDepth=1

Now I will update this post with more tests as I go. I do not expect much variation in them having been through them before.
EDIT NOTE: Yes I have Core-Parking disabled for Hyper-Threading.
EDIT - The Benchmark - Forgot to note how I'm benching these tests. Quite simply, I'm running on Horseback, with 3 followers also on horses and 2 dogs, from Whiterun Gates west to the path that turns off into Falkreath Hold, toward Markarth just past the Mountain passage. EDIT - I am now running this bench backwards, from that road, past Fort Greymoor and into Whiterun. This better shows the actual increased usage over time.
Test 1:

Hyper-Threading Enabled, Nvidia Threaded Optimization Enabled

iNumHWThreads=11
iHWThread6=10
iHWThread5=9
iHWThread4=8
iHWThread3=7
iHWThread2=6
iHWThread1=5
iAIThread2HWThread=4
iAIThread1HWThread=3
iRenderingThread2HWThread=2
iRenderingThread1HWThread=1

NOTES: This test I went for absolute threading. However I did not use Skyrim Performance Monitor to note the actual Thread Count. Observations are as follows

Core 0 was 100% most of the time. Core 4 saw about 50%, peaking about 70%. Core 8 peaked around 70% also but in general wasn't that busy. Core 10 even less usage again. These wee the only 4 cores to move. Other cores just showed typical background usage where applicable.

TREND - Core 0, 4, 8 and 10 are THE FIRST threads on the core, as in the cores are divided 0&1, 2&3, 4&5 etc etc. So already it is apparent from this test that Skyrim not only sticks to 4 cores, but where hyper-threading is concerned, it only touched the first threads. However, I did not experience particularly less performance from having only "half" a core active for Core 0 then I would have without HT. This is to my surprise.

Test 2:

Hyper-Threading On, Nvidia Threaded Optimization Off

Same settings as previous test in INI

This test shows different core usage, namely more usage of more cores. Same Benchmark byt with Nvidia Thread Optimization off.

Notes: Core 0 still 100%, Core 2 now averaging 75-80% peaking at 90, Core 4 averaging 20-25%, Core 6 now actually being used is up to the 50-60% mark, Core 8 showing 40% odd and Core 10 averaging 15% but peaking around 35%.

TRENDS: Still only using the first thread of each core, but this time it is using all 6 to my surprise. HOWEVER THERE WAS NO PERFORMACNE IMPROVEMENT WHATSOEVER.

From this point on I'm going to try some other tricks, such as changing the pre-rendered frames count and making use of ENB's UnsafeMemoryHacks settings as per suggestion. I will also start logging thread count from Test 4 onwards. EDIT - Well turns out SPM doesn't work under Windows 10 atm, I tried a few tricks to get it going but the performance counters have changed. This also explains why other programs I have don't work anymore. I suspect it would have been the same anyway. From my last observation with it, it usually has 33-37 threads open at the very start of the game during the menu, and then flatlines to about 26-28 threads while in game. From memory this number didn't change during loads made in game. Spewin' anyway :/
Test 3:

HT on, Nvidia tweak off, UnsafeMemoryHacks=True. 2 pre-rendered frames

Same INI as above tests.

NOTES: For starts, I did not find UnsafeMemoryhacks to provide any relief for the loading stutter, but this is ugrids 7. Results are the same as Test 2 mostly. Core 0 was still 100% and the other 5 cores it's using roughly the same, however this time I noticed a new trend. perhaps one that I didn't see before

TRENDS: This time I happened to have notice that Cores 2, 4, 6 and 8, in particular the latter 3, saw increased usage as I approached Whiterun. Core 2 spent most of its time at the 80% mark but by the end of the test was working around 95%. Core 4 was at 20% rising to nearly 40% with a big spike in the middle of the graph that hit roughly 55-60%. Core 6 was working about 50-60% on average, also rising toward the end, with a big spike in the middle to a bout 75%. Core 8 sat at a steady 35-40% but also rose toward the end, with a big spike in the middle Core 10 was about 20% but consistently got lower towards Whiterun. So the trend was slighlty more usage over time but in what appears ti be a define gradient. The spike seen at the half way point of the test might indicate combat, as a Saber cat roused me just outside Whiterun, probably enough to have the first few grids of the city exterior loaded.

I'm going to run this same test again for test 4, with pre-rendered frames at 1, and SPM monitoring the thread count.

TEST 4: Interesting results

HT On, Nvidia Tweak off, Unsafehacks true, prerendered frames 2
basically same as above

INI settings reverted to default of:
iNumHWThreads=5
iHWThread6=5
iHWThread5=5
iHWThread4=5
iHWThread3=4
iHWThread2=4
iHWThread1=4
iAIThread2HWThread=3
iAIThread1HWThread=3
iRenderingThread2HWThread=1
iRenderingThread1HWThread=0

NOTES: Now this one proved interesting. Not only did the cores shift, the stutter was noticeably less. Core 0 still used 100%, however the rest of the threads jumped ship. Core 3 saw 80-90% steady, Core 4 & 6 10-20%, Core 7 50% on average, Core 9 about 35% steady and Core 10 only 5-10% at most.

TRENDS: 7 cores became active this time, with most threads jumping to their HT cores. The cores seem to be more balanced out, I would say that with these default INI settings, threads were assigned more efficiently. Overall core usage was less, however it is apparent that the rendering, which I assume is on the 2 highest used cores, remained the same. When I say stuttering was less, it was still present but not as pronounced as previous runs. Interesting to say the least.

TEST 5: turned Default setting on their head

Same as test 4, INI settings flipped:

iNumHWThreads=5
iHWThread6=0
iHWThread5=0
iHWThread4=0
iHWThread3=1
iHWThread2=1
iHWThread1=1
iAIThread2HWThread=3
iAIThread1HWThread=3
iRenderingThread2HWThread=4
iRenderingThread1HWThread=5

NOTES: Well, the cores went back to the ordering found in the first 3 tests. Core 0 100%, Core 2 80-90%, Core 4 10-20%, Core 6 50% Steady, Core 8 40-50%, Core 10 10% give or take steady, and finally Core 11 was jumping up and down a bit in the 10-25% zones (Maybe a background task idk.)

TRENDS: Cores went back to the old ordering, so one of these settings must change the ordering. Not sure which at this stage. Performance remained the same as all tests.

OBSERVATIONAL NOTES AND CLOSING WORDS:
Stutter and FPS:

I am writing this mainly for people who don't understand why better hardware doesn't mean miracle performance. It is completely apparent to me that no matter what you change in the INIs, ENBlocal, the drivers etc etc, eventually even with current best hardware you are gonna hit a wall at draw calls. This game is completely and utterly bottlenecked by draw calls at the end of the day. The only true way to eliminate the stuttering is to find a balance of any settings that affect object load and total objects on scene, not because the renderer has trouble finalizing the render of triangles, but he calls to do so. This is exactly what is occurring on the busiest core. The stutter you get from going to grid to grid is caused by the drop of a number of calls and the demand for a number of new calls, the only way to eliminate it is to reduce the amount of objects to reduce the amount of calls. I can have static scenes with 7 million total triangles on scene, with 3-4000 draw calls, and get 50fps. Then I can get 2.5 million triangles, but 6400 draw calls and get 45fps. So you see the trend here, the actual amount of objects making calls is the detriment rather than the complexity of the model. There are only a few settings, albeit important, that affect this dramatically and they are all found under [terrainmanager] and the rest being the [LOD] settings (namely ObjectFade). Of course there are more settings that can have an effect, but at the peak of current hardware, these settings will have the most effect on fps and stuttering. Ugrids certainly counts as well towards this, but for an example I can have 5 grids with blockdistance at 70000/140000/250000 and object fade on 25 and get the same results with ugrids 7 blockdistance 45000/90000/250000 objects 20. Obviously for safety reason the former is preferable but as I mentioned above I personally prefer 7. I can eliminate any stutter by going 7 blockdistance 40k/80k/250k OF 16. However I can not do a whole great deal to bring back the fps with my CPU past 6000 draw calls. No matter what. In test 6 and 7 I amped my GPU to 1700mhz. This stays stable for about 20 minutes before the driver reverts to default (good feature from Nvidia IMO rather than BSOD lol). This makes no difference. Settings such as iFPSClamp only lock the frame times and provide a "time slowing" effect to stutter, which at high draw call interchange, becomes obvious and even more annoying than the original stutter. As for the rest of the settings being mentioned, sure they might help with memory speed etc, but remember I am talking about hardware that is at the pinnacle of our generation, so that is irrelevant here. Another little trick I tried to even out the frame rate with higher calls ws to increase shadow resolution to 8192. The logic here being if I can get shadows to be so good that they bring down the fps by say 20, then stutter will go much like locking the fps but without the slowing effect it brings (among other problems). This is sincerely not the case, no matter what level I bring the fps to even by other means, the draw call transition/interchange will remain per scene to scene and will always bring about the stutter. This is where the inefficiency lies and can only be averted by a faster CPU, not necessarily GHz but MIPS (Instructions per second). We don't measure by this anymore instead we measure by the time it takes to cycle (Hz) because this number varies greatly depending on the application. Sure, raw Hz are always gonna help, but the throughput remains the same, so for example you can't necessarily execute more scripts at a time, you can just get the ones you do have to go faster. A great example in our current, or better said analogy, is to look at the AMD Furys HBM memory vs GDDR5 - HBM is slow but wide and through-puts massive amounts of data in a single cycle, whereas GDDR5 is fast at throughputting smaller amounts (albeit still a lot these days). So at the end of the day this is the bottleneck that is DirectX 9 and there was only ever so much Bethesda could have done about it anyway. Unless they had of used 11, which god help us they better be for Fallout 4.

Anyway I hope that has enlightened you further, and best of luck with your game. If you have anything to add on this or are unsure of something, please leave a comment,

Link to comment
Share on other sites

 

HOWEVER THERE WAS NO PERFORMACNE IMPROVEMENT WHATSOEVER.

This makes me wonder then if your cpu was really doing more work, or if it was doing the same work less efficiently. Skyrim is 4 years old now (which is like 20 in human years), and there is only so much you can do to improve the performance of a 32-bit game on a 64-bit cpu. Still, this was an interesting post as there as been an ongoing debate about how much processor you really need to make Skyrim sing.

Link to comment
Share on other sites

This one still has me scratching me head, when i get back on the pc im going to run SPM and see exactly how many threads are open each time. Frim that particular test, this indicates the Nvidia threading tweak does indeed get the game running in a more efficient manner.

 

The idea here isnt to improve performance per say , but more to quell the masses questions about it. I notice that a lot of people are confused about this, and dont really know what to input for these settings.

 

I am surprised by one thing though, i haven't had HT on for a long, long time, but it doesn't seem to be hurting performance. I would of thought, and can swear the last time i tried it, that the performance was worse due to the core being effectively split. This makes me think there might be something else involved in the bottleneck. One thing though, loading stutter transitioning from grid to grid is more pronounced having said all that, but the frame rate hasn't changed.

 

I don't expect to gain any performance increase out of this having tried similar tests before, but if there is any optimization to be found then bonus.

Link to comment
Share on other sites

 

Seems this is a popular subject, and there have been many questions about this, I figured I'd start a thread with my findings for my CPU. As can be seen in my sig, I run a 6-core 3960X CPU clocked to 4.65Ghz. I can tell you now that this does not mean I get dream performance. Many questions about why Skyrim cannot perform up to standard can be answered quite simply - DirectX 9 is not designed for multi-threading. That being said, there are some settings that would seem to imply that they would help with multi-threading. The main ones being:

 

iNumHWThreads
iHWThread6
iHWThread5
iHWThread4
iHWThread3
iHWThread2
iHWThread1
iAIThread2HWThread
iAIThread1HWThread
iRenderingThread2HWThread
iRenderingThread1HWThread
Furthermore, there is a setting in Nvidia's control panel called "Threaded Optimization". This apparently helps applications to "take advantage of multple CPUs", however it is recommended off for older applications. Why is this relevant? Well perhaps any DirectX 9 application should be considered old. With that said, I will test all my MTing settings with and without this setting enabled and I will document it each time.
The rest of the multi-threading tweaks are irrelevant to me (well for this test anyway, because everyone probably has them on), as I'm only trying to get better performance from the renderer, which was always a long shot with DX9 anyway. So without further adieu, lets get to testing these settings.
The INI setup: I have enhanced my own INIs to my own tastes, a bit above Ultra settings. Note that I play at a ugrids of 7 despite recommendations, and have done so for 2 years. That being said, there is a reason why I do. I find that with a ugrids of 5, not only do I get a buttload of terrible pop-in as I walk by places, especially open areas like Whiterun plains, I find that this always introduces a "frame-spike" or 1-2 second stutter, which is inevitably caused by the CPU having to suddenly render all those popped in objects. Now while I can't avoid pop-in everywhere, I can minimize the visible distance of it by increasing the ugrids, but also there is also a performance reason where this can be effective - ENB includes an "Occlusion Culling" feature. What i find is that, if I'm in a dense area per say, such as the Falkreath Hold, that if everything is loaded past what my eye can see, or more specifically what is shown in a scene, the loading transition becomes much less of a stutter-funk as most things are loaded already, but not specifically rendered. Whether that logic is really just placebo has been proven to me otherwise by playing many hours of the game. In Falkreath in particular, I get minimal stutter from load at ugrids 5, however I get even less so at 7. Now there is a catch - the overall FPS of some scenes goes down. So in Whiterun specifically for example, I get between 45-52 FPS outdoors around the city. With ugrids at 5 I get 55-60. While I do get generally smoother grid transitions, it doesn't completely rule out the "frame-spikes" from loading, but it sure as hell seems to me to be a lot smoother in general.
You may view my INIs here: (Note that I have removed the above MT settings)
Skyrim.ini

[General]

sLanguage=ENGLISH

iLargeIntRefCount=262144

iPreloadSizeLimit=104857600

sIntroSequence=DISABLED.BIK

uGridsToLoad=7

uExterior Cell Buffer=36

bLoadLooseFiles=1

bRunHighLevelProcess=1

bMultiThreadMovement=1

bUseThreadedParticleSystem=1

bUseThreadedBlood=1

bUseThreadedMorpher=1

bUseThreadedTempEffects=1

bUseThreadedTextures=1

bUseThreadedMeshes=1

bUseThreadedLOD=1

bUseThreadedAI=1

bUseHardDriveCache=1

fFlickeringLightDistance=8192

[backgroundLoad]

bUseBackgroundFileLoader=1

bUseMultiThreadedFaceGen=1

bBackgroundCellLoads=1

bUseMultiThreadedTrees=1

bUseBackgroundFileLoader=1

bBackgroundLoadLipFiles=1

[Display]

fDefaultWorldFOV=75

fDefault1stPersonFOV=75

fSunShadowUpdateTime=0.01

fSunUpdateThreshold=0.0250

fShadowLODMaxStartFade=200.0

fSpecularLODMaxStartFade=3000.0

fLightLODMaxStartFade=8192.0

iShadowMapResolutionPrimary=4096

bShadowsOnGrass=1

bPerPixelLighting=1

bAllowScreenshot=1

bSimpleLighting=0

fDecalLifetime=56.5000

iAdapter=0

iPresentInterval=1

[Audio]

fMusicDuckingSeconds=6.0

fMusicUnDuckingSeconds=8.0

fMenuModeFadeOutTime=3.0

fMenuModeFadeInTime=1.0

[Grass]

bAllowCreateGrass=1

bAllowLoadGrass=0

bGrassPointLighting=1

b30GrassVS=1

iMaxGrassTypesPerTexure=15

iMinGrassSize=75 //<-- change this to 75 or higher, if you use grass on steroids.

 

[GeneralWarnings]

SGeneralMasterMismatchWarning=One or more plugins could not find the correct versions of the master files they depend on. Errors may occur during load or game play. Check the "Warnings.txt" file for more information.

 

[Archive]

sResourceArchiveList=Skyrim - Misc.bsa, Skyrim - Shaders.bsa, Skyrim - Textures.bsa, Skyrim - Interface.bsa, Skyrim - Animations.bsa, Skyrim - Meshes.bsa, Skyrim - Sounds.bsa

sResourceArchiveList2=Skyrim - Voices.bsa, Skyrim - VoicesExtra.bsa

 

[Combat]

fMagnetismStrafeHeadingMult=0.0

fMagnetismCombatMult=0.0

fMagnetismMult=0.0

fMagnetismLookingMult=0.0

f1PArrowTiltUpAngle=0.8

f3PArrowTiltUpAngle=0.8

[Papyrus]

fUpdateBudgetMS=1.2

fExtraTaskletBudgetMS=1.2

fPostLoadUpdateTimeMS=500.0

iMinMemoryPageSize=128

iMaxMemoryPageSize=512

iMaxAllocatedMemoryBytes=76800

bEnableLogging=0

bEnableTrace=0

bLoadDebugInformation=0

[Water]

iWaterReflectHeight=2048

iWaterReflectWidth=2048

bUseWaterDisplacements=1

bUseWaterRefractions=1

bUseWaterReflections=1

bUseWaterDepth=1

bUseWaterReflectionBlur=1

bReflectExplosions=1

iWaterBlurAmount=4

bAutoWaterSilhouetteReflections=1

bForceHighDetailReflections=0

bUseWaterHiRes=1

bUseWaterLOD=1

bReflectLODObjects=1

bReflectLODLand=1

bReflectSky=1

bReflectLODTrees=1

bUseWaterShader=1

[Trees]

bForceFullDetail=1

bEnableTreeAnimations=1

[Actor]

fVisibleNavmeshMoveDist=12288.0000

[TerrainManager]

bKeepLowDetailTerrain=0

[Controls]

bMouseAcceleration=0

[HAVOK]

iNumThreads=2

[saveGame]

bAllowProfileTransfer=1

bUseSaveGameHistory=1

[Decals]

bDecalMultithreaded=1

bForceAllDecals=1

[imagespace]

bDoRadialBlur=1

[LightingShader]

fDecalLODFadeEnd=1.0000

fDecalLODFadeStart=1.0000

[Animation]

fAnimInterpFarDist=10500.0000

fAnimInterpNearDist=10000.0000

 

[interface]

fBookOpenTime=200.0000

SkyrimPrefs.ini

[General]

fBrightLightColorB=1.0000

fBrightLightColorG=1.0000

fBrightLightColorR=1.0000

iStoryManagerLoggingEvent=-1

bEnableStoryManagerLogging=0

fDefaultFOV=75

[imagespace]

bDoDepthOfField=1

iRadialBlurLevel=3

[Display]

iBlurDeferredShadowMask=3

fInteriorShadowDistance=3000.0000

fShadowDistance=4000

iShadowMapResolutionSecondary=2048

iShadowMapResolutionPrimary=4096

iShadowSplitCount=2

iMaxAnisotropy=0

fLeafAnimDampenDistEnd=6000.0000

fLeafAnimDampenDistStart=4600.0000

fTreesMidLODSwitchDist=9999999.0000

bAllow30HairShader=1

iTexMipMapMinimum=4

iTexMipMap=4096

iTexMipMapSkip=0

iUseTexHiRes=1

iNormalMapQuality=4096

iTexNormalMapMinimum=4

iTexMipMapResolution=4096

iTexMipMapQuality=4096

iMipMapResolution=4096

iMipMapSize=4096

bFaceMipMaps=1

bFaceGenTexturing=1

bFaceGenTexturingQuality=4096

bHighQualityTexMipMaps=1

bDynamicWindowReflections=1

fGamma=1.0000

iShadowFilter=4

fDecalLOD2=1500.0000

fDecalLOD1=1000.0000

iActorShadowCountInt=12

iActorShadowCountExt=20

fSpecularLODStartFade=4096

fShadowLODStartFade=200.0000

fLightLODStartFade=8192.0000

bTransparencyMultisampling=0

iWaterMultiSamples=0

iMultiSample=0

iShadowMode=4

bTreesReceiveShadows=1

bDrawLandShadows=1

bDrawShadows=1

bDeferredShadows=1

bFull Screen=1

iSize H=1080

iSize W=1920

fMeshLODFadePercentDefault=1.2000

fMeshLODFadeBoundDefault=256.0000

fMeshLODLevel2FadeTreeDistance=1000000.0000

fMeshLODLevel1FadeTreeDistance=1000000.0000

fMeshLODLevel2FadeDist=1e+007

fMeshLODLevel1FadeDist=1e+007

bShadowMaskZPrepass=0

bMainZPrepass=0

iMaxSkinDecalsPerFrame=25

iMaxDecalsPerFrame=100

sD3DDevice="NVIDIA GeForce GTX 980 Ti" <--- change to your card!

bFXAAEnabled=0

iShadowMapResolution=4096

fShadowBiasScale=0.15

iShadowMaskQuarter=4

bFloatPointRenderTarget=1

iScreenShotIndex=203

bShadowsOnGrass=1

[Grass]

b30GrassVS=1

fGrassStartFadeDistance=9000

fGrassMaxStartFadeDistance=11000.0000

fGrassMinStartFadeDistance=0.0000

[MAIN]

bGamepadEnable=0

bCrosshairEnabled=1

fHUDOpacity=1.0000

bSaveOnPause=0

bSaveOnTravel=0

bSaveOnWait=0

bSaveOnRest=0

fSkyCellRefFadeDistance=150000.0000

[GamePlay]

bShowFloatingQuestMarkers=1

bShowQuestMarkers=1

iDifficulty=3

[interface]

bDialogueSubtitles=1

bGeneralSubtitles=1

fMouseCursorSpeed=1.0000

bShowCompass=1

[Controls]

fGamepadHeadingSensitivity=1.0000

fMouseHeadingSensitivity=0.0500

bAlwaysRunByDefault=1

bInvertYValues=0

bGamePadRumble=1

bMouseAcceleration=0

bUseKinect=0

[Particles]

iMaxDesired=750

[saveGame]

fAutosaveEveryXMins=60.0000

[AudioMenu]

fAudioMasterVolume=1.0000

fVal7=1.0000

uID7=1778591256

fVal6=1.0000

uID6=1778589878

fVal5=1.0000

uID5=3954

fVal4=1.0000

uID4=654727281

fVal3=1.0000

uID3=94881

fVal2=0.3000

uID2=466532

fVal1=0.8000

uID1=554685

fVal0=1.0000

uID0=1007612

[Clouds]

fCloudLevel2Distance=262144.0000

fCloudLevel1Distance=32768.0000

fCloudLevel0Distance=16384.0000

fNearDistance=25.0000

fCloudNearFadeDistance=9000.0000

[TerrainManager]

fTreeLoadDistance=125000

fBlockMaximumDistance=250000

fBlockLevel1Distance=100000

fBlockLevel0Distance=50000

fSplitDistanceMult=2.0

bShowLODInEditor=0

fCloudNearFadeDistance=9000.0000

[NavMesh]

fObstacleAlpha=0.5000

fCoverSideHighAlpha=0.8000

fCoverSideLowAlpha=0.6500

fEdgeFullAlpha=1.0000

fEdgeHighAlpha=0.7500

fEdgeLowAlpha=0.5000

fTriangleFullAlpha=0.7000

fTriangleHighAlpha=0.3500

fTriangleLowAlpha=0.2000

fLedgeBoxHalfHeight=25.0000

fEdgeDistFromVert=10.0000

fEdgeThickness=10.0000

fPointSize=2.5000

bUseThreadedMeshes=1

[Trees]

bRenderSkinnedTrees=1

uiMaxSkinnedTreesToRender=50

bUseMultiThreadedTrees=1

bEnableTreeAnimations=1

[Decals]

uMaxDecals=1000

bDecals=1

bSkinnedDecals=1

uMaxSkinDecals=100

uMaxSkinDecalsPerActor=60

[LOD]

fLODFadeOutMultObjects=15.000

fLODFadeOutMultItems=15.000

fLODFadeOutMultActors=15.000

fLODFadeOutMultSkyCell=1.0000

[Launcher]

bEnableFileSelection=1

bShowAllResolutions=1

uLastAspectRatio=3

[blurShaderHDR]

bDoHighDynamicRange=1

[blurShader]

bUseBlurShader=1

[HAVOK]

iNumThreads=2

[Water]

iWaterReflectHeight=1024

iWaterReflectWidth=1024

bUseWaterDisplacements=1

bUseWaterRefractions=1

bUseWaterReflections=1

bUseWaterDepth=1

 

Now I will update this post with more tests as I go. I do not expect much variation in them having been through them before.
EDIT NOTE: Yes I have Core-Parking disabled for Hyper-Threading.
EDIT - The Benchmark - Forgot to note how I'm benching these tests. Quite simply, I'm running on Horseback, with 3 followers also on horses and 2 dogs, from Whiterun Gates west to the path that turns off into Falkreath Hold, toward Markarth just past the Mountain passage.
Test 1:

Hyper-Threading Enabled, Nvidia Threaded Optimization Enabled

 

iNumHWThreads=11

iHWThread6=10

iHWThread5=9

iHWThread4=8

iHWThread3=7

iHWThread2=6

iHWThread1=5

iAIThread2HWThread=4

iAIThread1HWThread=3

iRenderingThread2HWThread=2

iRenderingThread1HWThread=1

 

NOTES: This test I went for absolute threading. However I did not use Skyrim Performance Monitor to note the actual Thread Count. Observations are as follows

 

Core 0 was 100% most of the time. Core 4 saw about 50%, peaking about 70%. Core 8 peaked around 70% also but in general wasn't that busy. Core 10 even less usage again. These wee the only 4 cores to move. Other cores just showed typical background usage where applicable.

 

TREND - Core 0, 4, 8 and 10 are THE FIRST threads on the core, as in the cores are divided 0&1, 2&3, 4&5 etc etc. So already it is apparent from this test that Skyrim not only sticks to 4 cores, but where hyper-threading is concerned, it only touched the first threads. However, I did not experience particularly less performance from having only "half" a core active for Core 0 then I would have without HT. This is to my surprise.

Test 2:

Hyper-Threading On, Nvidia Threaded Optimization Off

 

Same settings as previous test in INI

 

This test shows different core usage, namely more usage of more cores. Same Benchmark byt with Nvidia Thread Optimization off.

 

Notes: Core 0 still 100%, Core 2 now averaging 75-80% peaking at 90, Core 4 averaging 20-25%, Core 6 now actually being used is up to the 50-60% mark, Core 8 showing 40% odd and Core 10 averaging 15% but peaking around 35%.

 

TRENDS: Still only using the first thread of each core, but this time it is using all 6 to my surprise. HOWEVER THERE WAS NO PERFORMACNE IMPROVEMENT WHATSOEVER.

 

If you are OCing and disable CoolNQuiet, along with C6 and other functions, you will not see a difference without disabling hyperthreading (FX amd 8xxx are 4 cores with two threads each...not 8 cores). Its extremely difficult to accidentally set the cores to only four (three in your case). That said...

 

According to STEP Guide, and with further testing on my own, those HW entries are completely placebo at best. iNumHWThreads is the only one the game pays attention to. In your case, enter "6".

 

With my own ini setting at "8" for "iNumHWTHreads" I peak at 30%, average 30% and have determined that my lack of VRAM is where the bottleneck is.

 

There is NO PERFORMANCE DIFFERENCE when editing those "iHWThread" entries...I can put 128 of them and nothing changes. You are better off leaving those entries out than messing. Your initial Vtune should tell you in renderer.txt how many threads the game is going to use, and if it does not match (which it should since like v. 1.4 Skyrim) maybe force with insertion of that single line "iNumHWThreads=*" *being how many threads your Core CPU utilizes.

 

Good luck! :thumbsup:

 

EDIT: and Nvidia's default is enable for Threaded Optimization. LIkely that has nothing to do with the multithreading we are talking about here.

Link to comment
Share on other sites

Don't worry, ive got all potential power saving setting cut off and the cpu can only ever be in the c2 state at best (lowest drop is down to 3.3ghz when quiet) . All cores active (will try quad at some point just to document it, maybe even 3 as well)

 

I already realize that these settings are placebo, this is more or less to showcase that very fact to the public. The only new info i have so far feom this is that by turning off the nvidia tweak, the game used more cores but no gain in performance. In fact it used all 6 cores whereas with the tweak it uses 4. So seems Nvidia know something about this. I dont understand this at this stage though.

 

In the case of setting iNumHWThreads you actually have to set it to 5, 0 is a core. This is how it was set by default. These first tests just show clealry that nothing actually changed. During today, i will post the default tests.

 

Ultimately there is just no getting around DX9 and its single pipeline renderer. This is my bottleneck. My 980ti would love some more work :/

Link to comment
Share on other sites

Don't worry, ive got all potential power saving setting cut off and the cpu can only ever be in the c2 state at best (lowest drop is down to 3.3ghz when quiet) . All cores active (will try quad at some point just to document it, maybe even 3 as well)

 

I already realize that these settings are placebo, this is more or less to showcase that very fact to the public. The only new info i have so far feom this is that by turning off the nvidia tweak, the game used more cores but no gain in performance. In fact it used all 6 cores whereas with the tweak it uses 4. So seems Nvidia know something about this. I dont understand this at this stage though.

 

In the case of setting iNumHWThreads you actually have to set it to 5, 0 is a core. This is how it was set by default. These first tests just show clealry that nothing actually changed. During today, i will post the default tests.

 

Ultimately there is just no getting around DX9 and its single pipeline renderer. This is my bottleneck. My 980ti would love some more work :/

Likely the threaded optimazation for Nvidia is CPU to GPU, I've always left it default, but it defaults to "on". I'm curious if it turns off if I disable all but one core (on the cpu)....

Link to comment
Share on other sites

I imagine it wouldnt have any effect yes, at least if the core isnt threaded. I have to have a look at some documentation on this setting, despite seeming to help keep the cpu activity more efficient, i couldnt say at this point that actually provided any performance gain.
Link to comment
Share on other sites

According to Boris on the ENB forums, Skyrim has a fairly hackish multithreaded renderer; one core builds an array consisting of all the draw calls for a frame, then a different core processes the array.

 

In regards to hyperthreading, a fellow on the Tale Of Two Wastelands forum was experiencing microstutter in his game. I advised him to try disabling hyperthreading in his BIOS, which fixed the microstutter. I wouldn't be surprised if a slight bit of stutter is being caused by that.

 

Also, if you set an fps cap and set iFPSClamp= in Skyrim.ini to the same value, does your loading stutter go away? If you set EnableUnsafeMemoryHacks=true in enblocal.ini, does the cell-loading stutter go away @ ugrids=5?

Link to comment
Share on other sites

Im fairly positive the stutter is from HT atm, its too exacerbated and pronounced with it on. Having said that the overall FPS is about the same.

Regarding the unsafe hacks, that worked well on my 7970Ghz. It doesnt appear to do anything on the 980ti. Setting a frame cap has never ironed out that stutter for me, if i cap it at 20 then it will drop to 15 and if i cap it 55 it will drop to 35 etc. Having said that, i will run a test while i have HT on and see if that actually makes a difference now.

If Boris is correct (i imagine he is) then that explains why the overall fps appears to be more affected by the draw call count then the actual actual number of shapes drawn (they dont always correlate, i have seen scenes where triangle count exceeded 7 million but draw calls around 5000, and scenes with 4 million but ludicrous 9000 calls, best tested with JKs cities, and frames were better with the former)

 

EDIT: Test 5 indicates that one of the supposedly redundant settings actually changes which cores the game works from. Haven't analyzed this further as of yet.

Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...