From 795f5920132b212fe18f683536a2094c05e70e0a Mon Sep 17 00:00:00 2001 From: Evghenii Gaburov Date: Sun, 22 Feb 2015 12:17:37 +0100 Subject: [PATCH] added support for multiple architectures. right now, support is tested only for sm_35 and sm_37 --- ptxtools/GPUTargets.h | 40 ++++++++++++++++++++++++++++++++++++++++ ptxtools/ptxcc.cpp | 19 +++++++++++++------ ptxtools/ptxgen.cpp | 36 ++++++++++++++++++++++-------------- ptxtools/ptxgrammar.yy | 14 +++++++++----- 4 files changed, 84 insertions(+), 25 deletions(-) create mode 100644 ptxtools/GPUTargets.h diff --git a/ptxtools/GPUTargets.h b/ptxtools/GPUTargets.h new file mode 100644 index 00000000..8d73d26b --- /dev/null +++ b/ptxtools/GPUTargets.h @@ -0,0 +1,40 @@ +#pragma once + +// -*- mode: c++ -*- +/* + Copyright (c) 2015, Evghenii Gaburov + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +namespace GPUTargets +{ + static std::vector computeMode = {"sm_35", "sm_37"}; +} diff --git a/ptxtools/ptxcc.cpp b/ptxtools/ptxcc.cpp index 0aa5d344..2dad25d2 100644 --- a/ptxtools/ptxcc.cpp +++ b/ptxtools/ptxcc.cpp @@ -1,6 +1,6 @@ // -*- mode: c++ -*- /* - Copyright (c) 2014, Evghenii Gaburov + Copyright (c) 2014-2015, Evghenii Gaburov All rights reserved. Redistribution and use in source and binary forms, with or without @@ -43,6 +43,7 @@ met: #include #include #include "PTXParser.h" +#include "GPUTargets.h" /* @@ -119,9 +120,11 @@ static void lUsage(const int ret) fprintf(stdout, "\nusage: ptxcc [options] file.ptx \n"); fprintf(stdout, " [--help]\t\t\t This help\n"); fprintf(stdout, " [--verbose]\t\t\t Be verbose\n"); - fprintf(stdout, " [--arch=]\t\t\t GPU target architecture\n"); - fprintf(stdout, " \t\t\t\t sm_35 - K20, K40, GK110 chip \n"); - fprintf(stdout, " \t\t\t\t sm_37 - K80, GK210 chip \n"); + fprintf(stdout, " [--arch=]\t\t\t GPU target architectures:\n"); + fprintf(stdout, " \t\t\t\t "); + for (const auto& mode : GPUTargets::computeMode) + fprintf(stdout, "%s ", mode.c_str()); + fprintf(stdout, "\n"); fprintf(stdout, " [-o ]\t\t\t Output file name\n"); fprintf(stdout, " [-Xnvcc=]\t Arguments to pass through to \"nvcc\"\n"); fprintf(stdout, " \n"); @@ -134,7 +137,7 @@ int main(int _argc, char * _argv[]) char *argv[128]; lGetAllArgs(_argc, _argv, argc, argv); - std::string arch="sm_35"; + std::string arch = GPUTargets::computeMode.front(); std::string filePTX; std::string fileOBJ; std::string extString = ".ptx"; @@ -197,7 +200,11 @@ int main(int _argc, char * _argv[]) for (int i= 0; i < (int)nvccArgumentList.size(); i++) fprintf(stderr, " arg= %d : %s \n", i, nvccArgumentList[i].c_str()); #endif - assert(arch == std::string("sm_35") || arch == std::string("sm_37")); + if (std::find(GPUTargets::computeMode.begin(), GPUTargets::computeMode.end(), arch) == GPUTargets::computeMode.end()) + { + fprintf(stderr, "ptxcc fatal : --arch=%s is not supported; use option --help for more information\n", arch.c_str()); + exit(1); + } if (filePTX.empty()) { fprintf(stderr, "ptxcc fatal : No input file specified; use option --help for more information\n"); diff --git a/ptxtools/ptxgen.cpp b/ptxtools/ptxgen.cpp index c3431c8f..31e17f78 100644 --- a/ptxtools/ptxgen.cpp +++ b/ptxtools/ptxgen.cpp @@ -1,6 +1,6 @@ // -*- mode: c++ -*- /* - Copyright (c) 2014, Evghenii Gaburov + Copyright (c) 2014-2015, Evghenii Gaburov All rights reserved. Redistribution and use in source and binary forms, with or without @@ -43,6 +43,8 @@ met: #include #include #include +#include +#include "GPUTargets.h" #include #include @@ -51,9 +53,7 @@ met: template static std::string lValueToString(const T& value) { - std::ostringstream oss; - oss << value; - return oss.str(); + return std::to_string(value); } struct Exception : public std::exception @@ -220,9 +220,11 @@ static void lUsage(const int ret) fprintf(stdout, "\nusage: ptxgen [options] file.[ll,bc] \n"); fprintf(stdout, " [--help]\t\t This help\n"); fprintf(stdout, " [--verbose]\t\t Be verbose\n"); - fprintf(stdout, " [--arch=]\t\t GPU target architecture\n"); - fprintf(stdout, " \t\t\t sm_35 - K20, K40, GK110 chip \n"); - fprintf(stdout, " \t\t\t sm_37 - K80, GK210 chip \n"); + fprintf(stdout, " [--arch=]\t\t\t GPU target architectures:\n"); + fprintf(stdout, " \t\t\t\t "); + for (const auto& mode : GPUTargets::computeMode) + fprintf(stdout, "%s ", mode.c_str()); + fprintf(stdout, "\n"); fprintf(stdout, " [-o ]\t\t Output file name\n"); fprintf(stdout, " [-g]\t\t Enable generation of debuggin information \n"); fprintf(stdout, " [--opt=]\t\t Optimization parameters \n"); @@ -255,7 +257,7 @@ int main(int argc, char *argv[]) bool _useFastMath = false; bool _debug = false; bool _verbose = false; - std::string _arch = "sm_35"; + std::string _arch = GPUTargets::computeMode.front(); std::string fileIR, filePTX; for (int i = 1; i < argc; ++i) @@ -336,11 +338,11 @@ int main(int argc, char *argv[]) fprintf(stderr, "use_fast_math= %s\n", _useFastMath ? "true" : "false"); #endif - int computeArch = 35; - assert(_arch == std::string("sm_35") || _arch == std::string("sm_37")); - - if (_arch == std::string("sm_37")) - computeArch = 37; + if (std::find(GPUTargets::computeMode.begin(), GPUTargets::computeMode.end(), _arch) == GPUTargets::computeMode.end()) + { + fprintf(stderr, "ptxcc fatal : --arch=%s is not supported; use option --help for more information\n", _arch.c_str()); + exit(1); + } if (_useFastMath) { @@ -348,8 +350,14 @@ int main(int argc, char *argv[]) _precSqrt = _precDiv = 0; } + /* replace "sm" with "compute" */ + assert(_arch[0] == 's' && _arch[1] == 'm' && _arch[2] == '_'); + const std::string _mode = std::string("compute_") + &_arch[3]; + const int computeArch = atoi(&_arch[3]); + + std::vector nvvmOptions; - nvvmOptions.push_back("-arch=compute_"+std::to_string(computeArch)); + nvvmOptions.push_back("-arch=" + _mode); nvvmOptions.push_back("-ftz=" + lValueToString(_ftz)); nvvmOptions.push_back("-prec-sqrt=" + lValueToString(_precSqrt)); nvvmOptions.push_back("-prec-div=" + lValueToString(_precDiv)); diff --git a/ptxtools/ptxgrammar.yy b/ptxtools/ptxgrammar.yy index 3cdc3f36..61db3fca 100644 --- a/ptxtools/ptxgrammar.yy +++ b/ptxtools/ptxgrammar.yy @@ -1,5 +1,5 @@ /* - Copyright (c) 2014, Evghenii Gaburov + Copyright (c) 2014-2015, Evghenii Gaburov All rights reserved. Redistribution and use in source and binary forms, with or without @@ -43,6 +43,8 @@ met: #include #include #include + #include + #include "GPUTargets.h" #define YYERROR_VERBOSE 1 @@ -117,10 +119,12 @@ version: TOKEN_VERSION TOKEN_FLOAT { assert($2 >= 3.0); } ;//std::cerr << "Reading PTX version " << $2 << std::endl; }; target: TOKEN_TARGET TOKEN_STRING { - assert( - std::string($2) == std::string("sm_35") - || std::string($2) == std::string("sm_37") - ); } //std::cerr << "Target " << $2 << std::endl; }; + if (std::find(GPUTargets::computeMode.begin(), GPUTargets::computeMode.end(), std::string($2)) == GPUTargets::computeMode.end()) + { + fprintf(stderr, "ptxcc fatal : Found wrong Target=\"%s\" in ptx file\n", $2); + exit(-1); + } + } address_size: TOKEN_ADDRESS_SIZE TOKEN_INT { assert($2 == 64); } //std::cerr << "Address_Size " << $2 << std::endl; };