Fix issue #67: don't crash ungracefully if target ISA not supported on system.

- In the ispc-generated header files, a #define now indicates which compilation target
  was used.
- The examples use utility routines from the new file examples/cpuid.h to check the
  system's CPU's capabilities to see if it supports the ISA that was used for
  compiling the example code and print error messages if things aren't going to
  work...
This commit is contained in:
Matt Pharr
2011-07-18 12:29:43 +01:00
parent 213c3a9666
commit 6b0a6c0124
9 changed files with 327 additions and 0 deletions

View File

@@ -56,6 +56,7 @@ using namespace ispc;
#include "instrument.h"
#include "../timing.h"
#include "../cpuid.h"
#define NSUBSAMPLES 2
@@ -102,6 +103,38 @@ savePPM(const char *fname, int w, int h)
}
// Make sure that the vector ISA used during compilation is supported by
// the processor. The ISPC_TARGET_* macro is set in the ispc-generated
// header file that we include above.
static void
ensureTargetISAIsSupported() {
#if defined(ISPC_TARGET_SSE2)
bool isaSupported = CPUSupportsSSE2();
const char *target = "SSE2";
#elif defined(ISPC_TARGET_SSE4)
bool isaSupported = CPUSupportsSSE4();
const char *target = "SSE4";
#elif defined(ISPC_TARGET_AVX)
bool isaSupported = CPUSupportsAVX();
const char *target = "AVX";
#else
#error "Unknown ISPC_TARGET_* value"
#endif
if (!isaSupported) {
fprintf(stderr, "***\n*** Error: the ispc-compiled code uses the %s instruction "
"set, which isn't\n*** supported by this computer's CPU!\n", target);
fprintf(stderr, "***\n*** Please modify the "
#ifdef _MSC_VER
"MSVC project file "
#else
"Makefile "
#endif
"to select another target (e.g. sse2)\n***\n");
exit(1);
}
}
int main(int argc, char **argv)
{
if (argc != 4) {
@@ -116,6 +149,8 @@ int main(int argc, char **argv)
height = atoi (argv[3]);
}
ensureTargetISAIsSupported();
// Allocate space for output images
img = new unsigned char[width * height * 3];
fimg = new float[width * height * 3];