From abe869600b7653afb5346ea49ca2bf8620d5411b Mon Sep 17 00:00:00 2001 From: Lefteris Karapetsas Date: Wed, 15 Jul 2015 10:49:38 +0200 Subject: [PATCH] Query Platforms checks for special not found value This value is provided by the Khronos ICD --- libethash-cl/ethash_cl_miner.cpp | 62 +++++++++++++++----------------- 1 file changed, 28 insertions(+), 34 deletions(-) diff --git a/libethash-cl/ethash_cl_miner.cpp b/libethash-cl/ethash_cl_miner.cpp index 942819ba8..dc806be1b 100644 --- a/libethash-cl/ethash_cl_miner.cpp +++ b/libethash-cl/ethash_cl_miner.cpp @@ -78,16 +78,30 @@ ethash_cl_miner::~ethash_cl_miner() finish(); } +// Quite ugly. Saves us a lot of typing on these static functions +// since we can't keep the platforms vector in the class (static class/functions) +// +// LTODO: With a bit of general refactoring this could go away and platforms +// be queried only once and kept in the class. +#define ETHASHCL_GET_PLATFORMS(platforms_, failStmt_) \ + do { \ + try \ + { \ + cl::Platform::get(&platforms_); \ + } \ + catch (cl::Error const& err) \ + { \ + int errCode = err.err(); \ + if (errCode == CL_PLATFORM_NOT_FOUND_KHR) \ + ETHCL_LOG("No OpenCL platforms found"); \ + failStmt_; \ + } \ + } while(0) + string ethash_cl_miner::platform_info(unsigned _platformId, unsigned _deviceId) { vector platforms; - cl::Platform::get(&platforms); - if (platforms.empty()) - { - ETHCL_LOG("No OpenCL platforms found."); - return string(); - } - + ETHASHCL_GET_PLATFORMS(platforms, return string()); // get GPU device of the selected platform unsigned platform_num = min(_platformId, platforms.size() - 1); vector devices = getDevices(platforms, _platformId); @@ -119,19 +133,14 @@ std::vector ethash_cl_miner::getDevices(std::vector co unsigned ethash_cl_miner::getNumPlatforms() { vector platforms; - cl::Platform::get(&platforms); + ETHASHCL_GET_PLATFORMS(platforms, return 0); return platforms.size(); } unsigned ethash_cl_miner::getNumDevices(unsigned _platformId) { vector platforms; - cl::Platform::get(&platforms); - if (platforms.empty()) - { - ETHCL_LOG("No OpenCL platforms found."); - return 0; - } + ETHASHCL_GET_PLATFORMS(platforms, return 0); vector devices = getDevices(platforms, _platformId); if (devices.empty()) @@ -192,12 +201,7 @@ unsigned ethash_cl_miner::s_initialGlobalWorkSize = ethash_cl_miner::c_defaultGl bool ethash_cl_miner::searchForAllDevices(function _callback) { vector platforms; - cl::Platform::get(&platforms); - if (platforms.empty()) - { - ETHCL_LOG("No OpenCL platforms found."); - return false; - } + ETHASHCL_GET_PLATFORMS(platforms, return false); for (unsigned i = 0; i < platforms.size(); ++i) if (searchForAllDevices(i, _callback)) return true; @@ -208,7 +212,7 @@ bool ethash_cl_miner::searchForAllDevices(function _cal bool ethash_cl_miner::searchForAllDevices(unsigned _platformId, function _callback) { vector platforms; - cl::Platform::get(&platforms); + ETHASHCL_GET_PLATFORMS(platforms, return false); if (_platformId >= platforms.size()) return false; @@ -223,12 +227,7 @@ bool ethash_cl_miner::searchForAllDevices(unsigned _platformId, function _callback) { vector platforms; - cl::Platform::get(&platforms); - if (platforms.empty()) - { - ETHCL_LOG("No OpenCL platforms found."); - return; - } + ETHASHCL_GET_PLATFORMS(platforms, return); for (unsigned i = 0; i < platforms.size(); ++i) doForAllDevices(i, _callback); } @@ -236,7 +235,7 @@ void ethash_cl_miner::doForAllDevices(function _callbac void ethash_cl_miner::doForAllDevices(unsigned _platformId, function _callback) { vector platforms; - cl::Platform::get(&platforms); + ETHASHCL_GET_PLATFORMS(platforms, return); if (_platformId >= platforms.size()) return; @@ -275,12 +274,7 @@ bool ethash_cl_miner::init( try { vector platforms; - cl::Platform::get(&platforms); - if (platforms.empty()) - { - ETHCL_LOG("No OpenCL platforms found."); - return false; - } + ETHASHCL_GET_PLATFORMS(platforms, return false); // use selected platform _platformId = min(_platformId, platforms.size() - 1);