int MatrixMulDouble::setup() { // Validation of input values if((n == 0) || (m == 0) || (k == 0)) { std::cout << "Error: Matrix dimensions can not be 0" << std::endl; return SDK_FAILURE; } // Make sure the dimensions are multiples of blockSize const int vectorSize = 4; if(n % (blockSize * vectorSize) != 0) { n = (n / (blockSize * vectorSize) + 1) * (blockSize * vectorSize); } if(m % (blockSize * vectorSize) != 0) { m = (m / (blockSize * vectorSize) + 1) * (blockSize * vectorSize); } if(k % (blockSize * vectorSize) != 0) { k = (k / (blockSize * vectorSize) + 1) * (blockSize * vectorSize); } widthA = m; heightA = n; widthB = k; heightB = m; if(setupMatrixMulDouble() != SDK_SUCCESS) { return SDK_FAILURE; } int timer = sampleTimer->createTimer(); sampleTimer->resetTimer(timer); sampleTimer->startTimer(timer); int status = setupCL(); if(status != SDK_SUCCESS) { if(status == SDK_EXPECTED_FAILURE) { return SDK_EXPECTED_FAILURE; } return SDK_FAILURE; } sampleTimer->stopTimer(timer); setupTime = (cl_double)sampleTimer->readTimer(timer); return SDK_SUCCESS; }
int MatrixMulDouble::setup() { // Make sure the dimensions are multiples of blockSize const int vectorSize = 4; if(n % (blockSize * vectorSize) != 0) { n = (n / (blockSize * vectorSize) + 1) * (blockSize * vectorSize); } if(m % blockSize != 0) { m = (m / blockSize + 1) * blockSize; } if(k % (blockSize * vectorSize) != 0) { k = (k / (blockSize * vectorSize) + 1) * (blockSize * vectorSize); } widthA = m; heightA = n; widthB = k; heightB = m; if(setupMatrixMulDouble() != SDK_SUCCESS) return SDK_FAILURE; int timer = sampleCommon->createTimer(); sampleCommon->resetTimer(timer); sampleCommon->startTimer(timer); int status = setupCL(); if(status != SDK_SUCCESS) { if(status == SDK_EXPECTED_FAILURE) return SDK_EXPECTED_FAILURE; return SDK_FAILURE; } sampleCommon->stopTimer(timer); setupTime = (cl_double)sampleCommon->readTimer(timer); return SDK_SUCCESS; }