Skip to content

Commit 8b2ad69

Browse files
committed
disabled BVH8 on Skylake server CPUs
1 parent 0a2eb5f commit 8b2ad69

File tree

3 files changed

+30
-18
lines changed

3 files changed

+30
-18
lines changed

common/sys/sysinfo.cpp

+9-2
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ namespace embree
9999

100100
CPUModel getCPUModel()
101101
{
102+
if (getCPUVendor() != "GenuineIntel")
103+
return CPU_UNKNOWN;
104+
102105
int out[4];
103106
__cpuid(out, 0);
104107
if (out[0] < 1) return CPU_UNKNOWN;
@@ -119,6 +122,7 @@ namespace embree
119122
if (model == 0x2D) return CPU_CORE_SANDYBRIDGE; // Core i7, SandyBridge
120123
if (model == 0x45) return CPU_HASWELL; // Haswell
121124
if (model == 0x3C) return CPU_HASWELL; // Haswell
125+
if (model == 0x55) return CPU_SKYLAKE_SERVER; // Skylake server based CPUs
122126
return CPU_UNKNOWN;
123127
}
124128

@@ -131,7 +135,7 @@ namespace embree
131135
case CPU_CORE_SANDYBRIDGE: return "SandyBridge";
132136
case CPU_HASWELL : return "Haswell";
133137
case CPU_KNIGHTS_LANDING : return "Knights Landing";
134-
case CPU_SKYLAKE : return "Skylake";
138+
case CPU_SKYLAKE_SERVER : return "Skylake Server";
135139
default : return "Unknown CPU";
136140
}
137141
}
@@ -242,7 +246,7 @@ namespace embree
242246
if (xmm_enabled && cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_SSE4_1) cpu_features |= CPU_FEATURE_SSE41;
243247
if (xmm_enabled && cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_SSE4_2) cpu_features |= CPU_FEATURE_SSE42;
244248
if ( cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_POPCNT) cpu_features |= CPU_FEATURE_POPCNT;
245-
if (ymm_enabled && cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_AVX ) cpu_features |= CPU_FEATURE_AVX;
249+
if (ymm_enabled && cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_AVX ) cpu_features |= CPU_FEATURE_AVX | CPU_FEATURE_PSEUDO_HIFREQ256BIT;
246250
if (xmm_enabled && cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_F16C ) cpu_features |= CPU_FEATURE_F16C;
247251
if ( cpuid_leaf_1[ECX] & CPU_FEATURE_BIT_RDRAND) cpu_features |= CPU_FEATURE_RDRAND;
248252
if (ymm_enabled && cpuid_leaf_7[EBX] & CPU_FEATURE_BIT_AVX2 ) cpu_features |= CPU_FEATURE_AVX2;
@@ -261,6 +265,9 @@ namespace embree
261265
if (zmm_enabled && cpuid_leaf_7[EBX] & CPU_FEATURE_BIT_AVX512VL ) cpu_features |= CPU_FEATURE_AVX512VL;
262266
if (zmm_enabled && cpuid_leaf_7[ECX] & CPU_FEATURE_BIT_AVX512VBMI) cpu_features |= CPU_FEATURE_AVX512VBMI;
263267

268+
if (getCPUModel() == CPU_SKYLAKE_SERVER)
269+
cpu_features &= ~CPU_FEATURE_PSEUDO_HIFREQ256BIT;
270+
264271
return cpu_features;
265272
}
266273

common/sys/sysinfo.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ namespace embree
8686
CPU_CORE_SANDYBRIDGE,
8787
CPU_HASWELL,
8888
CPU_KNIGHTS_LANDING,
89-
CPU_SKYLAKE
89+
CPU_SKYLAKE_SERVER
9090
};
9191

9292
/*! get the full path to the running executable */
@@ -133,6 +133,8 @@ namespace embree
133133
static const int CPU_FEATURE_AVX512IFMA = 1 << 23;
134134
static const int CPU_FEATURE_AVX512VBMI = 1 << 24;
135135

136+
static const int CPU_FEATURE_PSEUDO_HIFREQ256BIT = 1 << 30;
137+
136138
/*! get CPU features */
137139
int getCPUFeatures();
138140

@@ -155,6 +157,9 @@ namespace embree
155157
static const int AVX512KNL = AVX2 | CPU_FEATURE_AVX512F | CPU_FEATURE_AVX512PF | CPU_FEATURE_AVX512ER | CPU_FEATURE_AVX512CD;
156158
static const int AVX512SKX = AVX2 | CPU_FEATURE_AVX512F | CPU_FEATURE_AVX512DQ | CPU_FEATURE_AVX512CD | CPU_FEATURE_AVX512BW | CPU_FEATURE_AVX512VL;
157159

160+
static const int AVX_FAST = AVX | CPU_FEATURE_PSEUDO_HIFREQ256BIT;
161+
static const int AVX2_FAST = AVX2 | CPU_FEATURE_PSEUDO_HIFREQ256BIT;
162+
158163
/*! converts ISA bitvector into a string */
159164
std::string stringOfISA(int features);
160165

kernels/common/scene.cpp

+15-15
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ namespace embree
153153
switch (mode) {
154154
case /*0b00*/ 0:
155155
#if defined (EMBREE_TARGET_SIMD8)
156-
if (device->hasISA(AVX))
156+
if (device->hasISA(AVX_FAST))
157157
{
158158
if (isHighQuality())
159159
accels.add(device->bvh8_factory->BVH8Triangle4(this,BVHFactory::BuildVariant::HIGH_QUALITY,BVHFactory::IntersectVariant::FAST));
@@ -172,7 +172,7 @@ namespace embree
172172

173173
case /*0b01*/ 1:
174174
#if defined (EMBREE_TARGET_SIMD8)
175-
if (device->hasISA(AVX))
175+
if (device->hasISA(AVX_FAST))
176176
accels.add(device->bvh8_factory->BVH8Triangle4v(this,BVHFactory::BuildVariant::STATIC,BVHFactory::IntersectVariant::ROBUST));
177177
else
178178
#endif
@@ -186,7 +186,7 @@ namespace embree
186186
else /* dynamic */
187187
{
188188
#if defined (EMBREE_TARGET_SIMD8)
189-
if (device->hasISA(AVX))
189+
if (device->hasISA(AVX_FAST))
190190
{
191191
int mode = 2*(int)isCompact() + 1*(int)isRobust();
192192
switch (mode) {
@@ -233,7 +233,7 @@ namespace embree
233233
int mode = 2*(int)isCompact() + 1*(int)isRobust();
234234

235235
#if defined (EMBREE_TARGET_SIMD8)
236-
if (device->hasISA(AVX2)) // BVH8 reduces performance on AVX only-machines
236+
if (device->hasISA(AVX2_FAST)) // BVH8 reduces performance on AVX only-machines
237237
{
238238
switch (mode) {
239239
case /*0b00*/ 0: accels.add(device->bvh8_factory->BVH8Triangle4iMB(this,BVHFactory::BuildVariant::STATIC,BVHFactory::IntersectVariant::FAST )); break;
@@ -275,7 +275,7 @@ namespace embree
275275
switch (mode) {
276276
case /*0b00*/ 0:
277277
#if defined (EMBREE_TARGET_SIMD8)
278-
if (device->hasISA(AVX))
278+
if (device->hasISA(AVX_FAST))
279279
{
280280
if (isHighQuality())
281281
accels.add(device->bvh8_factory->BVH8Quad4v(this,BVHFactory::BuildVariant::HIGH_QUALITY,BVHFactory::IntersectVariant::FAST));
@@ -294,7 +294,7 @@ namespace embree
294294

295295
case /*0b01*/ 1:
296296
#if defined (EMBREE_TARGET_SIMD8)
297-
if (device->hasISA(AVX))
297+
if (device->hasISA(AVX_FAST))
298298
accels.add(device->bvh8_factory->BVH8Quad4v(this,BVHFactory::BuildVariant::STATIC,BVHFactory::IntersectVariant::ROBUST));
299299
else
300300
#endif
@@ -308,7 +308,7 @@ namespace embree
308308
else /* dynamic */
309309
{
310310
#if defined (EMBREE_TARGET_SIMD8)
311-
if (device->hasISA(AVX))
311+
if (device->hasISA(AVX_FAST))
312312
{
313313
int mode = 2*(int)isCompact() + 1*(int)isRobust();
314314
switch (mode) {
@@ -353,7 +353,7 @@ namespace embree
353353
switch (mode) {
354354
case /*0b00*/ 0:
355355
#if defined (EMBREE_TARGET_SIMD8)
356-
if (device->hasISA(AVX))
356+
if (device->hasISA(AVX_FAST))
357357
accels.add(device->bvh8_factory->BVH8Quad4iMB(this,BVHFactory::BuildVariant::STATIC,BVHFactory::IntersectVariant::FAST));
358358
else
359359
#endif
@@ -362,7 +362,7 @@ namespace embree
362362

363363
case /*0b01*/ 1:
364364
#if defined (EMBREE_TARGET_SIMD8)
365-
if (device->hasISA(AVX))
365+
if (device->hasISA(AVX_FAST))
366366
accels.add(device->bvh8_factory->BVH8Quad4iMB(this,BVHFactory::BuildVariant::STATIC,BVHFactory::IntersectVariant::ROBUST));
367367
else
368368
#endif
@@ -390,7 +390,7 @@ namespace embree
390390
if (isStatic())
391391
{
392392
#if defined (EMBREE_TARGET_SIMD8)
393-
if (device->hasISA(AVX2)) // only enable on HSW machines, for SNB this codepath is slower
393+
if (device->hasISA(AVX2_FAST)) // only enable on HSW machines, for SNB this codepath is slower
394394
{
395395
switch (mode) {
396396
case /*0b00*/ 0: accels.add(device->bvh8_factory->BVH8OBBBezier1v(this)); break;
@@ -438,7 +438,7 @@ namespace embree
438438
if (device->hair_accel_mb == "default")
439439
{
440440
#if defined (EMBREE_TARGET_SIMD8)
441-
if (device->hasISA(AVX2) && !isCompact()) // only enable on HSW machines, on SNB this codepath is slower
441+
if (device->hasISA(AVX2_FAST) && !isCompact()) // only enable on HSW machines, on SNB this codepath is slower
442442
{
443443
accels.add(device->bvh8_factory->BVH8OBBBezier1iMB(this));
444444
}
@@ -464,7 +464,7 @@ namespace embree
464464
if (isStatic())
465465
{
466466
#if defined (EMBREE_TARGET_SIMD8)
467-
if (device->hasISA(AVX) && !isCompact())
467+
if (device->hasISA(AVX_FAST) && !isCompact())
468468
accels.add(device->bvh8_factory->BVH8Line4i(this));
469469
else
470470
#endif
@@ -489,7 +489,7 @@ namespace embree
489489
if (device->line_accel_mb == "default")
490490
{
491491
#if defined (EMBREE_TARGET_SIMD8)
492-
if (device->hasISA(AVX) && !isCompact())
492+
if (device->hasISA(AVX_FAST) && !isCompact())
493493
accels.add(device->bvh8_factory->BVH8Line4iMB(this));
494494
else
495495
#endif
@@ -543,7 +543,7 @@ namespace embree
543543
if (device->object_accel == "default")
544544
{
545545
#if defined (EMBREE_TARGET_SIMD8)
546-
if (device->hasISA(AVX) && !isCompact())
546+
if (device->hasISA(AVX_FAST) && !isCompact())
547547
{
548548
//if (isStatic()) {
549549
accels.add(device->bvh8_factory->BVH8UserGeometry(this,BVHFactory::BuildVariant::STATIC));
@@ -574,7 +574,7 @@ namespace embree
574574
#if defined(EMBREE_GEOMETRY_USER)
575575
if (device->object_accel_mb == "default" ) {
576576
#if defined (EMBREE_TARGET_SIMD8)
577-
if (device->hasISA(AVX) && !isCompact())
577+
if (device->hasISA(AVX_FAST) && !isCompact())
578578
accels.add(device->bvh8_factory->BVH8UserGeometryMB(this));
579579
else
580580
#endif

0 commit comments

Comments
 (0)