Select fastest CUDA device. Merged from trunk.

2.0
castano 16 years ago
parent cc4741ed03
commit d787b30379

@ -3,7 +3,7 @@ NVIDIA Texture Tools version 2.0.5
* Detect mismatch between CUDA runtime and driver, and disable CUDA in that case. * Detect mismatch between CUDA runtime and driver, and disable CUDA in that case.
* Fix cmake files when compiling NVTT as a shared library. * Fix cmake files when compiling NVTT as a shared library.
* When linking nvtt dynamically on unix, link all libraries dynamically. * When linking nvtt dynamically on unix, link all libraries dynamically.
* Merge fixes from trunk. * Select fastest CUDA device.
NVIDIA Texture Tools version 2.0.4 NVIDIA Texture Tools version 2.0.4
* Fix error in RGB format output; reported by jonsoh. See issue 49. * Fix error in RGB format output; reported by jonsoh. See issue 49.

@ -211,6 +211,10 @@ Compressor::Compressor() : m(*new Compressor::Private())
if (m.cudaEnabled) if (m.cudaEnabled)
{ {
// Select fastest CUDA device.
int device = cuda::getFastestDevice();
cuda::setDevice(device);
m.cuda = new CudaCompressor(); m.cuda = new CudaCompressor();
if (!m.cuda->isValid()) if (!m.cuda->isValid())
@ -237,6 +241,10 @@ void Compressor::enableCudaAcceleration(bool enable)
if (m.cudaEnabled && m.cuda == NULL) if (m.cudaEnabled && m.cuda == NULL)
{ {
// Select fastest CUDA device.
int device = cuda::getFastestDevice();
cuda::setDevice(device);
m.cuda = new CudaCompressor(); m.cuda = new CudaCompressor();
if (!m.cuda->isValid()) if (!m.cuda->isValid())

@ -151,6 +151,35 @@ int nv::cuda::deviceCount()
return 0; return 0;
} }
int nv::cuda::getFastestDevice()
{
int max_gflops_device = 0;
#if defined HAVE_CUDA
int max_gflops = 0;
const int device_count = deviceCount();
int current_device = 0;
while (current_device < device_count)
{
cudaDeviceProp device_properties;
cudaGetDeviceProperties(&device_properties, current_device);
int gflops = device_properties.multiProcessorCount * device_properties.clockRate;
if (device_properties.major != -1 && device_properties.minor != -1)
{
if( gflops > max_gflops )
{
max_gflops = gflops;
max_gflops_device = current_device;
}
}
current_device++;
}
#endif
return max_gflops_device;
}
/// Activate the given devices. /// Activate the given devices.
bool nv::cuda::setDevice(int i) bool nv::cuda::setDevice(int i)
{ {

@ -31,6 +31,7 @@ namespace nv
{ {
bool isHardwarePresent(); bool isHardwarePresent();
int deviceCount(); int deviceCount();
int getFastestDevice();
bool setDevice(int i); bool setDevice(int i);
}; };

Loading…
Cancel
Save