From e89425fd38ebfc2772a59ad87ac007973d48b36d Mon Sep 17 00:00:00 2001 From: Ali Sherief Date: Wed, 24 Mar 2021 10:50:32 +0000 Subject: [PATCH] Fix CUDA kangaroo not compiling --- Check.cpp | 8 +- GPU/.GPUEngine.cu.swp | Bin 0 -> 40960 bytes GPU/.GPUEngine.h.swp | Bin 0 -> 12288 bytes GPU/GPUCompute.h | 14 +- GPU/GPUEngine.cu | 32 +- GPU/GPUEngine.h | 9 +- HashTable.h | 11 +- Kangaroo.cpp | 4 +- Kangaroo.h | 1 - Makefile | 25 +- Network.cpp | 2 +- detect_cuda.sh | 13 + deviceQuery/Makefile | 331 +++++++++++ deviceQuery/NsightEclipse.xml | 69 +++ deviceQuery/cuda_build_log.txt | 3 + deviceQuery/deviceQuery | Bin 0 -> 711768 bytes deviceQuery/deviceQuery.cpp | 325 +++++++++++ deviceQuery/deviceQuery.o | Bin 0 -> 16984 bytes deviceQuery/inc/helper_cuda.h | 951 ++++++++++++++++++++++++++++++++ deviceQuery/inc/helper_string.h | 683 +++++++++++++++++++++++ deviceQuery/readme.txt | 8 + 21 files changed, 2450 insertions(+), 39 deletions(-) create mode 100644 GPU/.GPUEngine.cu.swp create mode 100644 GPU/.GPUEngine.h.swp create mode 100644 detect_cuda.sh create mode 100644 deviceQuery/Makefile create mode 100644 deviceQuery/NsightEclipse.xml create mode 100644 deviceQuery/cuda_build_log.txt create mode 100755 deviceQuery/deviceQuery create mode 100644 deviceQuery/deviceQuery.cpp create mode 100644 deviceQuery/deviceQuery.o create mode 100644 deviceQuery/inc/helper_cuda.h create mode 100644 deviceQuery/inc/helper_string.h create mode 100644 deviceQuery/readme.txt diff --git a/Check.cpp b/Check.cpp index aac26d1..929621c 100644 --- a/Check.cpp +++ b/Check.cpp @@ -512,8 +512,10 @@ void Kangaroo::Check(std::vector gpuId,std::vector gridSize) { for(int i=0;i gpuId,std::vector gridSize) { lastJump[i] = jmp; #endif - if(IsDP(cpuPx[i].bits64[3])) { + if(IsDP(&cpuPx[i])) { // Search for DP found bool found = false; diff --git a/GPU/.GPUEngine.cu.swp b/GPU/.GPUEngine.cu.swp new file mode 100644 index 0000000000000000000000000000000000000000..466c77b31e9ffbce352262bc5633b0f160f31202 GIT binary patch literal 40960 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 literal 0 HcmV?d00001 diff --git a/GPU/GPUCompute.h b/GPU/GPUCompute.h index 878ceb0..dc91bcd 100644 --- a/GPU/GPUCompute.h +++ b/GPU/GPUCompute.h @@ -19,7 +19,7 @@ // ----------------------------------------------------------------------------------------- -__device__ void ComputeKangaroos(uint64_t *kangaroos,uint32_t maxFound,uint32_t *out,uint64_t dpMask) { +__device__ void ComputeKangaroos(uint64_t *kangaroos,uint32_t maxFound,uint32_t *out,uint64_t *dpMask) { uint64_t px[GPU_GRP_SIZE][4]; uint64_t py[GPU_GRP_SIZE][4]; @@ -34,6 +34,7 @@ __device__ void ComputeKangaroos(uint64_t *kangaroos,uint32_t maxFound,uint32_t uint64_t ry[4]; uint64_t _s[4]; uint64_t _p[4]; + uint64_t dpmask0, dpmask1, dpmask2, dpmask3; uint32_t jmp; #ifdef USE_SYMMETRY @@ -42,6 +43,11 @@ __device__ void ComputeKangaroos(uint64_t *kangaroos,uint32_t maxFound,uint32_t LoadKangaroos(kangaroos,px,py,dist); #endif + dpmask0 = dpMask[0]; + dpmask1 = dpMask[1]; + dpmask2 = dpMask[2]; + dpmask3 = dpMask[3]; + for(int run = 0; run < NB_RUN; run++) { // P1 = jumpPoint @@ -86,14 +92,14 @@ __device__ void ComputeKangaroos(uint64_t *kangaroos,uint32_t maxFound,uint32_t Load256(px[g],rx); Load256(py[g],ry); - Add128(dist[g],jD[jmp]); + Add256(dist[g],jD[jmp]); #ifdef USE_SYMMETRY if(ModPositive256(py[g])) ModNeg256Order(dist[g]); #endif - - if((px[g][3] & dpMask) == 0) { + uint64_t *pxg = px[g]; + if((pxg[0] & dpmask0) == 0 && (pxg[1] & dpmask1) == 0 && (pxg[2] & dpmask2) == 0 && (pxg[3] & dpmask3) == 0) { // Distinguished point uint32_t pos = atomicAdd(out,1); diff --git a/GPU/GPUEngine.cu b/GPU/GPUEngine.cu index 634ae6c..67cc464 100644 --- a/GPU/GPUEngine.cu +++ b/GPU/GPUEngine.cu @@ -32,7 +32,7 @@ // --------------------------------------------------------------------------------------- -__global__ void comp_kangaroos(uint64_t *kangaroos,uint32_t maxFound,uint32_t *found,uint64_t dpMask) { +__global__ void comp_kangaroos(uint64_t *kangaroos,uint32_t maxFound,uint32_t *found,uint64_t *dpMask) { int xPtr = (blockIdx.x*blockDim.x*GPU_GRP_SIZE) * KSIZE; // x[4] , y[4] , d[2], lastJump ComputeKangaroos(kangaroos + xPtr,maxFound,found,dpMask); @@ -198,6 +198,14 @@ GPUEngine::GPUEngine(int nbThreadGroup,int nbThreadPerGroup,int gpuId,uint32_t m outputItem = NULL; outputItemPinned = NULL; jumpPinned = NULL; + dpMask=NULL; + + // dpMask + err = cudaMalloc((void **)&dpMask,32); + if(err != cudaSuccess) { + printf("GPUEngine: Allocate dpmask memory: %s\n",cudaGetErrorString(err)); + return; + } // Input kangaroos kangarooSize = nbThread * GPU_GRP_SIZE * KSIZE * 8; @@ -256,6 +264,7 @@ GPUEngine::GPUEngine(int nbThreadGroup,int nbThreadPerGroup,int gpuId,uint32_t m GPUEngine::~GPUEngine() { + if(dpMask) cudaFree(dpMask); if(inputKangaroo) cudaFree(inputKangaroo); if(outputItem) cudaFree(outputItem); if(inputKangarooPinned) cudaFreeHost(inputKangarooPinned); @@ -413,7 +422,7 @@ void GPUEngine::SetKangaroos(Int *px,Int *py,Int *d) { if(idx % 2 == WILD) dOff.ModAddK1order(&wildOffset); inputKangarooPinned[g * strideSize + t + 8 * nbThreadPerGroup] = dOff.bits64[0]; inputKangarooPinned[g * strideSize + t + 9 * nbThreadPerGroup] = dOff.bits64[1]; - inputKangarooPinned[g * stridesize + t + 10 * nbThreadPerGroup] = dOff.bits64[2]; + inputKangarooPinned[g * strideSize + t + 10 * nbThreadPerGroup] = dOff.bits64[2]; inputKangarooPinned[g * strideSize + t + 11 * nbThreadPerGroup] = dOff.bits64[3]; #ifdef USE_SYMMETRY // Last jump @@ -495,7 +504,6 @@ void GPUEngine::GetKangaroos(Int *px,Int *py,Int *d) { } -// I think this is for public leys and initial distances void GPUEngine::SetKangaroo(uint64_t kIdx,Int *px,Int *py,Int *d) { int gSize = KSIZE * GPU_GRP_SIZE; @@ -542,7 +550,7 @@ void GPUEngine::SetKangaroo(uint64_t kIdx,Int *px,Int *py,Int *d) { #ifdef USE_SYMMETRY // Last jump inputKangarooPinned[0] = (uint64_t)NB_JUMP; - cudaMemcpy(inputKangaroo + (b * blockSize + g * strideSize + t + 12 * nbThreadPerGroup),inputKangarooPinned,8,cudaMemcpyHostToDevice);" + cudaMemcpy(inputKangaroo + (b * blockSize + g * strideSize + t + 12 * nbThreadPerGroup),inputKangarooPinned,8,cudaMemcpyHostToDevice); #endif } @@ -566,16 +574,20 @@ bool GPUEngine::callKernel() { } -void GPUEngine::SetParams(uint64_t dpMask,Int *distance,Int *px,Int *py) { - - this->dpMask = dpMask; +void GPUEngine::SetParams(Int *dpMask,Int *distance,Int *px,Int *py) { + uint64_t hostDpMask[4]; + hostDpMask[0] = dpMask->bits64[0]; + hostDpMask[1] = dpMask->bits64[1]; + hostDpMask[2] = dpMask->bits64[2]; + hostDpMask[3] = dpMask->bits64[3]; + cudaMemcpy(this->dpMask, hostDpMask, 32, cudaMemcpyHostToDevice); for(int i=0;i< NB_JUMP;i++) memcpy(jumpPinned + 4*i,distance[i].bits64,32); cudaMemcpyToSymbol(jD,jumpPinned,jumpSize); cudaError_t err = cudaGetLastError(); if(err != cudaSuccess) { - printf("GPUEngine: SetParams: Failed to copy to constant memory: %s\n",cudaGetErrorString(err)); + printf("GPUEngine: SetParams: Failed to copy to constant memory (distance): %s\n",cudaGetErrorString(err)); return; } @@ -584,7 +596,7 @@ void GPUEngine::SetParams(uint64_t dpMask,Int *distance,Int *px,Int *py) { cudaMemcpyToSymbol(jPx,jumpPinned,jumpSize); err = cudaGetLastError(); if(err != cudaSuccess) { - printf("GPUEngine: SetParams: Failed to copy to constant memory: %s\n",cudaGetErrorString(err)); + printf("GPUEngine: SetParams: Failed to copy to constant memory (px): %s\n",cudaGetErrorString(err)); return; } @@ -593,7 +605,7 @@ void GPUEngine::SetParams(uint64_t dpMask,Int *distance,Int *px,Int *py) { cudaMemcpyToSymbol(jPy,jumpPinned,jumpSize); err = cudaGetLastError(); if(err != cudaSuccess) { - printf("GPUEngine: SetParams: Failed to copy to constant memory: %s\n",cudaGetErrorString(err)); + printf("GPUEngine: SetParams: Failed to copy to constant memory (py): %s\n",cudaGetErrorString(err)); return; } diff --git a/GPU/GPUEngine.h b/GPU/GPUEngine.h index 7131bd7..b9b73ea 100644 --- a/GPU/GPUEngine.h +++ b/GPU/GPUEngine.h @@ -44,10 +44,10 @@ class GPUEngine { GPUEngine(int nbThreadGroup,int nbThreadPerGroup,int gpuId,uint32_t maxFound); ~GPUEngine(); - void SetParams(uint64_t dpMask,Int *distance,Int *px,Int *py); - void SetKangaroos(uint64_t kIdx, Int *px,Int *py,Int *d); + void SetParams(Int *dpMask,Int *distance,Int *px,Int *py); + void SetKangaroos(Int *px,Int *py,Int *d); void GetKangaroos(Int *px,Int *py,Int *d); - void SetKangaroo(Int *px,Int *py,Int *d); + void SetKangaroo(uint64_t kIdx, Int *px,Int *py,Int *d); bool Launch(std::vector &hashFound,bool spinWait = false); void SetWildOffset(Int *offset); int GetNbThread(); @@ -80,8 +80,7 @@ class GPUEngine { uint32_t kangarooSize; uint32_t kangarooSizePinned; uint32_t jumpSize; - uint64_t dpMask; - + uint64_t *dpMask; }; #endif // GPUENGINEH diff --git a/HashTable.h b/HashTable.h index 6de0aef..d5fb9f0 100644 --- a/HashTable.h +++ b/HashTable.h @@ -21,6 +21,7 @@ #include #include #include "SECPK1/Point.h" +#include "Constants.h" #ifdef WIN64 #include #endif @@ -33,15 +34,6 @@ #define ADD_DUPLICATE 1 #define ADD_COLLISION 2 -union int128_s { - - uint8_t i8[16]; - uint16_t i16[8]; - uint32_t i32[4]; - uint64_t i64[2]; - -}; - union int256_s { uint8_t i8[32]; uint16_t i16[16]; @@ -49,7 +41,6 @@ union int256_s { uint64_t i64[4]; }; -typedef union int128_s int128_t; typedef union int256_s int256_t; #define safe_free(x) if(x) {free(x);x=NULL;} diff --git a/Kangaroo.cpp b/Kangaroo.cpp index 863e2e5..ac3751d 100644 --- a/Kangaroo.cpp +++ b/Kangaroo.cpp @@ -557,7 +557,9 @@ void Kangaroo::SolveKeyGPU(TH_PARAM *ph) { #else gpu->SetWildOffset(&rangeWidthDiv2); #endif - gpu->SetParams(dMask,jumpDistance,jumpPointx,jumpPointy); + Int dmaskInt; + HashTable::toInt(&dMask, &dmaskInt); + gpu->SetParams(&dmaskInt,jumpDistance,jumpPointx,jumpPointy); gpu->SetKangaroos(ph->px,ph->py,ph->distance); if(workFile.length()==0 || !saveKangaroo) { diff --git a/Kangaroo.h b/Kangaroo.h index 873d7af..ffd564f 100644 --- a/Kangaroo.h +++ b/Kangaroo.h @@ -181,7 +181,6 @@ class Kangaroo { void SaveWork(uint64_t totalCount,double totalTime,TH_PARAM *threads,int nbThread); void SaveServerWork(); void FetchWalks(uint64_t nbWalk,Int *x,Int *y,Int *d); - void FetchWalks(uint64_t nbWalk,std::vector& kangs,Int* x,Int* y,Int* d); void FetchWalks(uint64_t nbWalk,std::vector& kangs,Int* x,Int* y,Int* d); void FectchKangaroos(TH_PARAM *threads); FILE *ReadHeader(std::string fileName,uint32_t *version,int type); diff --git a/Makefile b/Makefile index 12598b5..c63feaa 100644 --- a/Makefile +++ b/Makefile @@ -40,10 +40,27 @@ OBJET = $(addprefix $(OBJDIR)/, \ endif CXX = g++ -CUDA = /usr/local/cuda-8.0 -CXXCUDA = /usr/bin/g++-4.8 +CUDA = /usr/local/cuda +CXXCUDA = /usr/bin/g++ NVCC = $(CUDA)/bin/nvcc + +all: driverquery bsgs + +ifdef gpu +ifndef ccap +driverquery: + . ./detect_cuda.sh +ccap=$(shell cat cuda_version.txt) +else +driverquery: + @echo "Compiling against manually selected CUDA version ${ccap}" +endif +else +driverquery: +endif + + ifdef gpu ifdef debug @@ -79,8 +96,6 @@ endif $(OBJDIR)/%.o : %.cpp $(CXX) $(CXXFLAGS) -o $@ -c $< -all: bsgs - bsgs: $(OBJET) @echo Making Kangaroo... $(CXX) $(OBJET) $(LFLAGS) -o kangaroo @@ -101,4 +116,6 @@ clean: @rm -f obj/*.o @rm -f obj/GPU/*.o @rm -f obj/SECPK1/*.o + @rm -f cuda_version.txt + @rm -f cuda_build_log.txt diff --git a/Network.cpp b/Network.cpp index 2d440b3..e5b4981 100644 --- a/Network.cpp +++ b/Network.cpp @@ -1016,7 +1016,7 @@ bool Kangaroo::GetKangaroosFromServer(std::string& fileName,std::vectorcuda_build_log.txt 2>&1 && ccap=$(./deviceQuery | grep "CUDA Capability" | awk -F ' ' '{print $2}' | sort -n | head -n 1 | sed 's/\.//') +if [ -n "${ccap}" ]; then + echo "Detected ccap=${ccap}" +else + echo "Autodetection failed, falling back to ccap=30 (set the ccap variable to override this)" + ccap="30" +fi +cd - +echo ${ccap} > cuda_version.txt diff --git a/deviceQuery/Makefile b/deviceQuery/Makefile new file mode 100644 index 0000000..f63ea93 --- /dev/null +++ b/deviceQuery/Makefile @@ -0,0 +1,331 @@ +################################################################################ +# +# Copyright 1993-2015 NVIDIA Corporation. All rights reserved. +# +# NOTICE TO USER: +# +# This source code is subject to NVIDIA ownership rights under U.S. and +# international Copyright laws. +# +# NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE +# CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR +# IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH +# REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. +# IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, +# OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE +# OR PERFORMANCE OF THIS SOURCE CODE. +# +# U.S. Government End Users. This source code is a "commercial item" as +# that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of +# "commercial computer software" and "commercial computer software +# documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) +# and is provided to the U.S. Government only as a commercial end item. +# Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through +# 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the +# source code with only those rights set forth herein. +# +################################################################################ +# +# Makefile project only supported on Mac OS X and Linux Platforms) +# +################################################################################ + +# Location of the CUDA Toolkit +CUDA_PATH ?= /usr/local/cuda + +############################## +# start deprecated interface # +############################## +ifeq ($(x86_64),1) + $(info WARNING - x86_64 variable has been deprecated) + $(info WARNING - please use TARGET_ARCH=x86_64 instead) + TARGET_ARCH ?= x86_64 +endif +ifeq ($(ARMv7),1) + $(info WARNING - ARMv7 variable has been deprecated) + $(info WARNING - please use TARGET_ARCH=armv7l instead) + TARGET_ARCH ?= armv7l +endif +ifeq ($(aarch64),1) + $(info WARNING - aarch64 variable has been deprecated) + $(info WARNING - please use TARGET_ARCH=aarch64 instead) + TARGET_ARCH ?= aarch64 +endif +ifeq ($(ppc64le),1) + $(info WARNING - ppc64le variable has been deprecated) + $(info WARNING - please use TARGET_ARCH=ppc64le instead) + TARGET_ARCH ?= ppc64le +endif +ifneq ($(GCC),) + $(info WARNING - GCC variable has been deprecated) + $(info WARNING - please use HOST_COMPILER=$(GCC) instead) + HOST_COMPILER ?= $(GCC) +endif +ifneq ($(abi),) + $(error ERROR - abi variable has been removed) +endif +############################ +# end deprecated interface # +############################ + +# architecture +HOST_ARCH := $(shell uname -m) +TARGET_ARCH ?= $(HOST_ARCH) +ifneq (,$(filter $(TARGET_ARCH),x86_64 aarch64 sbsa ppc64le armv7l)) + ifneq ($(TARGET_ARCH),$(HOST_ARCH)) + ifneq (,$(filter $(TARGET_ARCH),x86_64 aarch64 sbsa ppc64le)) + TARGET_SIZE := 64 + else ifneq (,$(filter $(TARGET_ARCH),armv7l)) + TARGET_SIZE := 32 + endif + else + TARGET_SIZE := $(shell getconf LONG_BIT) + endif +else + $(error ERROR - unsupported value $(TARGET_ARCH) for TARGET_ARCH!) +endif + +# sbsa and aarch64 systems look similar. Need to differentiate them at host level for now. +ifeq ($(HOST_ARCH),aarch64) + ifeq ($(CUDA_PATH)/targets/sbsa-linux,$(shell ls -1d $(CUDA_PATH)/targets/sbsa-linux 2>/dev/null)) + HOST_ARCH := sbsa + TARGET_ARCH := sbsa + endif +endif + +ifneq ($(TARGET_ARCH),$(HOST_ARCH)) + ifeq (,$(filter $(HOST_ARCH)-$(TARGET_ARCH),aarch64-armv7l x86_64-armv7l x86_64-aarch64 x86_64-sbsa x86_64-ppc64le)) + $(error ERROR - cross compiling from $(HOST_ARCH) to $(TARGET_ARCH) is not supported!) + endif +endif + +# When on native aarch64 system with userspace of 32-bit, change TARGET_ARCH to armv7l +ifeq ($(HOST_ARCH)-$(TARGET_ARCH)-$(TARGET_SIZE),aarch64-aarch64-32) + TARGET_ARCH = armv7l +endif + +# operating system +HOST_OS := $(shell uname -s 2>/dev/null | tr "[:upper:]" "[:lower:]") +TARGET_OS ?= $(HOST_OS) +ifeq (,$(filter $(TARGET_OS),linux darwin qnx android)) + $(error ERROR - unsupported value $(TARGET_OS) for TARGET_OS!) +endif + +# host compiler +ifeq ($(TARGET_OS),darwin) + ifeq ($(shell expr `xcodebuild -version | grep -i xcode | awk '{print $$2}' | cut -d'.' -f1` \>= 5),1) + HOST_COMPILER ?= clang++ + endif +else ifneq ($(TARGET_ARCH),$(HOST_ARCH)) + ifeq ($(HOST_ARCH)-$(TARGET_ARCH),x86_64-armv7l) + ifeq ($(TARGET_OS),linux) + HOST_COMPILER ?= arm-linux-gnueabihf-g++ + else ifeq ($(TARGET_OS),qnx) + ifeq ($(QNX_HOST),) + $(error ERROR - QNX_HOST must be passed to the QNX host toolchain) + endif + ifeq ($(QNX_TARGET),) + $(error ERROR - QNX_TARGET must be passed to the QNX target toolchain) + endif + export QNX_HOST + export QNX_TARGET + HOST_COMPILER ?= $(QNX_HOST)/usr/bin/arm-unknown-nto-qnx6.6.0eabi-g++ + else ifeq ($(TARGET_OS),android) + HOST_COMPILER ?= arm-linux-androideabi-g++ + endif + else ifeq ($(TARGET_ARCH),aarch64) + ifeq ($(TARGET_OS), linux) + HOST_COMPILER ?= aarch64-linux-gnu-g++ + else ifeq ($(TARGET_OS),qnx) + ifeq ($(QNX_HOST),) + $(error ERROR - QNX_HOST must be passed to the QNX host toolchain) + endif + ifeq ($(QNX_TARGET),) + $(error ERROR - QNX_TARGET must be passed to the QNX target toolchain) + endif + export QNX_HOST + export QNX_TARGET + HOST_COMPILER ?= $(QNX_HOST)/usr/bin/q++ + else ifeq ($(TARGET_OS), android) + HOST_COMPILER ?= aarch64-linux-android-clang++ + endif + else ifeq ($(TARGET_ARCH),sbsa) + HOST_COMPILER ?= aarch64-linux-gnu-g++ + else ifeq ($(TARGET_ARCH),ppc64le) + HOST_COMPILER ?= powerpc64le-linux-gnu-g++ + endif +endif +HOST_COMPILER ?= g++ +NVCC := $(CUDA_PATH)/bin/nvcc -ccbin $(HOST_COMPILER) + +# internal flags +NVCCFLAGS := -m${TARGET_SIZE} +CCFLAGS := +LDFLAGS := + +# build flags +ifeq ($(TARGET_OS),darwin) + LDFLAGS += -rpath $(CUDA_PATH)/lib + CCFLAGS += -arch $(HOST_ARCH) +else ifeq ($(HOST_ARCH)-$(TARGET_ARCH)-$(TARGET_OS),x86_64-armv7l-linux) + LDFLAGS += --dynamic-linker=/lib/ld-linux-armhf.so.3 + CCFLAGS += -mfloat-abi=hard +else ifeq ($(TARGET_OS),android) + LDFLAGS += -pie + CCFLAGS += -fpie -fpic -fexceptions +endif + +ifneq ($(TARGET_ARCH),$(HOST_ARCH)) + ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-linux) + ifneq ($(TARGET_FS),) + GCCVERSIONLTEQ46 := $(shell expr `$(HOST_COMPILER) -dumpversion` \<= 4.6) + ifeq ($(GCCVERSIONLTEQ46),1) + CCFLAGS += --sysroot=$(TARGET_FS) + endif + LDFLAGS += --sysroot=$(TARGET_FS) + LDFLAGS += -rpath-link=$(TARGET_FS)/lib + LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib + LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib/arm-linux-gnueabihf + endif + endif + ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-linux) + ifneq ($(TARGET_FS),) + GCCVERSIONLTEQ46 := $(shell expr `$(HOST_COMPILER) -dumpversion` \<= 4.6) + ifeq ($(GCCVERSIONLTEQ46),1) + CCFLAGS += --sysroot=$(TARGET_FS) + endif + LDFLAGS += --sysroot=$(TARGET_FS) + LDFLAGS += -rpath-link=$(TARGET_FS)/lib -L$(TARGET_FS)/lib + LDFLAGS += -rpath-link=$(TARGET_FS)/lib/aarch64-linux-gnu -L$(TARGET_FS)/lib/aarch64-linux-gnu + LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib -L$(TARGET_FS)/usr/lib + LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib/aarch64-linux-gnu -L$(TARGET_FS)/usr/lib/aarch64-linux-gnu + LDFLAGS += --unresolved-symbols=ignore-in-shared-libs + CCFLAGS += -isystem=$(TARGET_FS)/usr/include -I$(TARGET_FS)/usr/include -I$(TARGET_FS)/usr/include/libdrm + CCFLAGS += -isystem=$(TARGET_FS)/usr/include/aarch64-linux-gnu -I$(TARGET_FS)/usr/include/aarch64-linux-gnu + endif + endif + ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-qnx) + NVCCFLAGS += --qpp-config 5.4.0,gcc_ntoaarch64le + CCFLAGS += -DWIN_INTERFACE_CUSTOM -I/usr/include/aarch64-qnx-gnu + LDFLAGS += -lsocket + LDFLAGS += -L/usr/lib/aarch64-qnx-gnu + CCFLAGS += "-Wl\,-rpath-link\,/usr/lib/aarch64-qnx-gnu" + ifdef TARGET_OVERRIDE + LDFLAGS += -lslog2 + endif + + ifneq ($(TARGET_FS),) + LDFLAGS += -L$(TARGET_FS)/usr/lib + CCFLAGS += "-Wl\,-rpath-link\,$(TARGET_FS)/usr/lib" + LDFLAGS += -L$(TARGET_FS)/usr/libnvidia + CCFLAGS += "-Wl\,-rpath-link\,$(TARGET_FS)/usr/libnvidia" + endif + endif +endif + +ifdef TARGET_OVERRIDE # cuda toolkit targets override + NVCCFLAGS += -target-dir $(TARGET_OVERRIDE) +endif + +# Install directory of different arch +CUDA_INSTALL_TARGET_DIR := +ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-linux) + CUDA_INSTALL_TARGET_DIR = targets/armv7-linux-gnueabihf/ +else ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-linux) + CUDA_INSTALL_TARGET_DIR = targets/aarch64-linux/ +else ifeq ($(TARGET_ARCH)-$(TARGET_OS),sbsa-linux) + CUDA_INSTALL_TARGET_DIR = targets/sbsa-linux/ +else ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-android) + CUDA_INSTALL_TARGET_DIR = targets/armv7-linux-androideabi/ +else ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-android) + CUDA_INSTALL_TARGET_DIR = targets/aarch64-linux-androideabi/ +else ifeq ($(TARGET_ARCH)-$(TARGET_OS),armv7l-qnx) + CUDA_INSTALL_TARGET_DIR = targets/ARMv7-linux-QNX/ +else ifeq ($(TARGET_ARCH)-$(TARGET_OS),aarch64-qnx) + CUDA_INSTALL_TARGET_DIR = targets/aarch64-qnx/ +else ifeq ($(TARGET_ARCH),ppc64le) + CUDA_INSTALL_TARGET_DIR = targets/ppc64le-linux/ +endif + +# Debug build flags +ifeq ($(dbg),1) + NVCCFLAGS += -g -G + BUILD_TYPE := debug +else + BUILD_TYPE := release +endif + +ALL_CCFLAGS := +ALL_CCFLAGS += $(NVCCFLAGS) +ALL_CCFLAGS += $(EXTRA_NVCCFLAGS) +ALL_CCFLAGS += $(addprefix -Xcompiler ,$(CCFLAGS)) +ALL_CCFLAGS += $(addprefix -Xcompiler ,$(EXTRA_CCFLAGS)) + +SAMPLE_ENABLED := 1 + +ALL_LDFLAGS := +ALL_LDFLAGS += $(ALL_CCFLAGS) +ALL_LDFLAGS += $(addprefix -Xlinker ,$(LDFLAGS)) +ALL_LDFLAGS += $(addprefix -Xlinker ,$(EXTRA_LDFLAGS)) + +# Common includes and paths for CUDA +INCLUDES := -I./inc +LIBRARIES := + +################################################################################ + +# Gencode arguments +SMS ?= 35 37 50 52 60 61 70 75 80 86 + +ifeq ($(SMS),) +$(info >>> WARNING - no SM architectures have been specified - waiving sample <<<) +SAMPLE_ENABLED := 0 +endif + +ifeq ($(GENCODE_FLAGS),) +# Generate SASS code for each SM architecture listed in $(SMS) +$(foreach sm,$(SMS),$(eval GENCODE_FLAGS += -gencode arch=compute_$(sm),code=sm_$(sm))) + +# Generate PTX code from the highest SM architecture in $(SMS) to guarantee forward-compatibility +HIGHEST_SM := $(lastword $(sort $(SMS))) +ifneq ($(HIGHEST_SM),) +GENCODE_FLAGS += -gencode arch=compute_$(HIGHEST_SM),code=compute_$(HIGHEST_SM) +endif +endif + +ALL_CCFLAGS += --threads 0 + +ifeq ($(SAMPLE_ENABLED),0) +EXEC ?= @echo "[@]" +endif + +################################################################################ + +# Target rules +all: build + +build: deviceQuery + +check.deps: +ifeq ($(SAMPLE_ENABLED),0) + @echo "Sample will be waived due to the above missing dependencies" +else + @echo "Sample is ready - all dependencies have been met" +endif + +deviceQuery.o:deviceQuery.cpp + $(EXEC) $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $< + +deviceQuery: deviceQuery.o + $(EXEC) $(NVCC) $(ALL_LDFLAGS) $(GENCODE_FLAGS) -o $@ $+ $(LIBRARIES) + +run: build + $(EXEC) ./deviceQuery + +clean: + rm -f deviceQuery deviceQuery.o + +clobber: clean diff --git a/deviceQuery/NsightEclipse.xml b/deviceQuery/NsightEclipse.xml new file mode 100644 index 0000000..624b0b9 --- /dev/null +++ b/deviceQuery/NsightEclipse.xml @@ -0,0 +1,69 @@ + + + + deviceQuery + + cudaSetDevice + cudaGetDeviceCount + cudaGetDeviceProperties + cudaDriverGetVersion + cudaRuntimeGetVersion + + + whole + + ./ + ../ + ../../common/inc + + + CUDA Runtime API + Device Query + + + + + + + + true + deviceQuery.cpp + + 1:CUDA Basic Topics + + sm35 + sm37 + sm50 + sm52 + sm60 + sm61 + sm70 + sm75 + sm80 + sm86 + + + x86_64 + linux + + + windows7 + + + x86_64 + macosx + + + arm + + + ppc64le + linux + + + + all + + Device Query + exe + diff --git a/deviceQuery/cuda_build_log.txt b/deviceQuery/cuda_build_log.txt new file mode 100644 index 0000000..d7a8f06 --- /dev/null +++ b/deviceQuery/cuda_build_log.txt @@ -0,0 +1,3 @@ +make[1]: Entering directory '/root/Kangaroo-256/deviceQuery' +make[1]: Nothing to be done for 'all'. +make[1]: Leaving directory '/root/Kangaroo-256/deviceQuery' diff --git a/deviceQuery/deviceQuery b/deviceQuery/deviceQuery new file mode 100755 index 0000000000000000000000000000000000000000..1ec57528ca2845975f568f4c2e4a8f12e36cf922 GIT binary patch literal 711768 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 literal 0 HcmV?d00001 diff --git a/deviceQuery/deviceQuery.cpp b/deviceQuery/deviceQuery.cpp new file mode 100644 index 0000000..094aa7f --- /dev/null +++ b/deviceQuery/deviceQuery.cpp @@ -0,0 +1,325 @@ +/* + * Copyright 1993-2015 NVIDIA Corporation. All rights reserved. + * + * Please refer to the NVIDIA end user license agreement (EULA) associated + * with this source code for terms and conditions that govern your use of + * this software. Any use, reproduction, disclosure, or distribution of + * this software and related documentation outside the terms of the EULA + * is strictly prohibited. + * + */ +/* This sample queries the properties of the CUDA devices present in the system + * via CUDA Runtime API. */ + +// std::system includes + +#include +#include + +#include +#include +#include + +int *pArgc = NULL; +char **pArgv = NULL; + +#if CUDART_VERSION < 5000 + +// CUDA-C includes +#include + +// This function wraps the CUDA Driver API into a template function +template +inline void getCudaAttribute(T *attribute, CUdevice_attribute device_attribute, + int device) { + CUresult error = cuDeviceGetAttribute(attribute, device_attribute, device); + + if (CUDA_SUCCESS != error) { + fprintf( + stderr, + "cuSafeCallNoSync() Driver API error = %04d from file <%s>, line %i.\n", + error, __FILE__, __LINE__); + + exit(EXIT_FAILURE); + } +} + +#endif /* CUDART_VERSION < 5000 */ + +//////////////////////////////////////////////////////////////////////////////// +// Program main +//////////////////////////////////////////////////////////////////////////////// +int main(int argc, char **argv) { + pArgc = &argc; + pArgv = argv; + + printf("%s Starting...\n\n", argv[0]); + printf( + " CUDA Device Query (Runtime API) version (CUDART static linking)\n\n"); + + int deviceCount = 0; + cudaError_t error_id = cudaGetDeviceCount(&deviceCount); + + if (error_id != cudaSuccess) { + printf("cudaGetDeviceCount returned %d\n-> %s\n", + static_cast(error_id), cudaGetErrorString(error_id)); + printf("Result = FAIL\n"); + exit(EXIT_FAILURE); + } + + // This function call returns 0 if there are no CUDA capable devices. + if (deviceCount == 0) { + printf("There are no available device(s) that support CUDA\n"); + } else { + printf("Detected %d CUDA Capable device(s)\n", deviceCount); + } + + int dev, driverVersion = 0, runtimeVersion = 0; + + for (dev = 0; dev < deviceCount; ++dev) { + cudaSetDevice(dev); + cudaDeviceProp deviceProp; + cudaGetDeviceProperties(&deviceProp, dev); + + printf("\nDevice %d: \"%s\"\n", dev, deviceProp.name); + + // Console log + cudaDriverGetVersion(&driverVersion); + cudaRuntimeGetVersion(&runtimeVersion); + printf(" CUDA Driver Version / Runtime Version %d.%d / %d.%d\n", + driverVersion / 1000, (driverVersion % 100) / 10, + runtimeVersion / 1000, (runtimeVersion % 100) / 10); + printf(" CUDA Capability Major/Minor version number: %d.%d\n", + deviceProp.major, deviceProp.minor); + + char msg[256]; +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) + sprintf_s(msg, sizeof(msg), + " Total amount of global memory: %.0f MBytes " + "(%llu bytes)\n", + static_cast(deviceProp.totalGlobalMem / 1048576.0f), + (unsigned long long)deviceProp.totalGlobalMem); +#else + snprintf(msg, sizeof(msg), + " Total amount of global memory: %.0f MBytes " + "(%llu bytes)\n", + static_cast(deviceProp.totalGlobalMem / 1048576.0f), + (unsigned long long)deviceProp.totalGlobalMem); +#endif + printf("%s", msg); + + printf(" (%2d) Multiprocessors, (%3d) CUDA Cores/MP: %d CUDA Cores\n", + deviceProp.multiProcessorCount, + _ConvertSMVer2Cores(deviceProp.major, deviceProp.minor), + _ConvertSMVer2Cores(deviceProp.major, deviceProp.minor) * + deviceProp.multiProcessorCount); + printf( + " GPU Max Clock rate: %.0f MHz (%0.2f " + "GHz)\n", + deviceProp.clockRate * 1e-3f, deviceProp.clockRate * 1e-6f); + +#if CUDART_VERSION >= 5000 + // This is supported in CUDA 5.0 (runtime API device properties) + printf(" Memory Clock rate: %.0f Mhz\n", + deviceProp.memoryClockRate * 1e-3f); + printf(" Memory Bus Width: %d-bit\n", + deviceProp.memoryBusWidth); + + if (deviceProp.l2CacheSize) { + printf(" L2 Cache Size: %d bytes\n", + deviceProp.l2CacheSize); + } + +#else + // This only available in CUDA 4.0-4.2 (but these were only exposed in the + // CUDA Driver API) + int memoryClock; + getCudaAttribute(&memoryClock, CU_DEVICE_ATTRIBUTE_MEMORY_CLOCK_RATE, + dev); + printf(" Memory Clock rate: %.0f Mhz\n", + memoryClock * 1e-3f); + int memBusWidth; + getCudaAttribute(&memBusWidth, + CU_DEVICE_ATTRIBUTE_GLOBAL_MEMORY_BUS_WIDTH, dev); + printf(" Memory Bus Width: %d-bit\n", + memBusWidth); + int L2CacheSize; + getCudaAttribute(&L2CacheSize, CU_DEVICE_ATTRIBUTE_L2_CACHE_SIZE, dev); + + if (L2CacheSize) { + printf(" L2 Cache Size: %d bytes\n", + L2CacheSize); + } + +#endif + + printf( + " Maximum Texture Dimension Size (x,y,z) 1D=(%d), 2D=(%d, " + "%d), 3D=(%d, %d, %d)\n", + deviceProp.maxTexture1D, deviceProp.maxTexture2D[0], + deviceProp.maxTexture2D[1], deviceProp.maxTexture3D[0], + deviceProp.maxTexture3D[1], deviceProp.maxTexture3D[2]); + printf( + " Maximum Layered 1D Texture Size, (num) layers 1D=(%d), %d layers\n", + deviceProp.maxTexture1DLayered[0], deviceProp.maxTexture1DLayered[1]); + printf( + " Maximum Layered 2D Texture Size, (num) layers 2D=(%d, %d), %d " + "layers\n", + deviceProp.maxTexture2DLayered[0], deviceProp.maxTexture2DLayered[1], + deviceProp.maxTexture2DLayered[2]); + + printf(" Total amount of constant memory: %zu bytes\n", + deviceProp.totalConstMem); + printf(" Total amount of shared memory per block: %zu bytes\n", + deviceProp.sharedMemPerBlock); + printf(" Total shared memory per multiprocessor: %zu bytes\n", + deviceProp.sharedMemPerMultiprocessor); + printf(" Total number of registers available per block: %d\n", + deviceProp.regsPerBlock); + printf(" Warp size: %d\n", + deviceProp.warpSize); + printf(" Maximum number of threads per multiprocessor: %d\n", + deviceProp.maxThreadsPerMultiProcessor); + printf(" Maximum number of threads per block: %d\n", + deviceProp.maxThreadsPerBlock); + printf(" Max dimension size of a thread block (x,y,z): (%d, %d, %d)\n", + deviceProp.maxThreadsDim[0], deviceProp.maxThreadsDim[1], + deviceProp.maxThreadsDim[2]); + printf(" Max dimension size of a grid size (x,y,z): (%d, %d, %d)\n", + deviceProp.maxGridSize[0], deviceProp.maxGridSize[1], + deviceProp.maxGridSize[2]); + printf(" Maximum memory pitch: %zu bytes\n", + deviceProp.memPitch); + printf(" Texture alignment: %zu bytes\n", + deviceProp.textureAlignment); + printf( + " Concurrent copy and kernel execution: %s with %d copy " + "engine(s)\n", + (deviceProp.deviceOverlap ? "Yes" : "No"), deviceProp.asyncEngineCount); + printf(" Run time limit on kernels: %s\n", + deviceProp.kernelExecTimeoutEnabled ? "Yes" : "No"); + printf(" Integrated GPU sharing Host Memory: %s\n", + deviceProp.integrated ? "Yes" : "No"); + printf(" Support host page-locked memory mapping: %s\n", + deviceProp.canMapHostMemory ? "Yes" : "No"); + printf(" Alignment requirement for Surfaces: %s\n", + deviceProp.surfaceAlignment ? "Yes" : "No"); + printf(" Device has ECC support: %s\n", + deviceProp.ECCEnabled ? "Enabled" : "Disabled"); +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) + printf(" CUDA Device Driver Mode (TCC or WDDM): %s\n", + deviceProp.tccDriver ? "TCC (Tesla Compute Cluster Driver)" + : "WDDM (Windows Display Driver Model)"); +#endif + printf(" Device supports Unified Addressing (UVA): %s\n", + deviceProp.unifiedAddressing ? "Yes" : "No"); + printf(" Device supports Managed Memory: %s\n", + deviceProp.managedMemory ? "Yes" : "No"); + printf(" Device supports Compute Preemption: %s\n", + deviceProp.computePreemptionSupported ? "Yes" : "No"); + printf(" Supports Cooperative Kernel Launch: %s\n", + deviceProp.cooperativeLaunch ? "Yes" : "No"); + printf(" Supports MultiDevice Co-op Kernel Launch: %s\n", + deviceProp.cooperativeMultiDeviceLaunch ? "Yes" : "No"); + printf(" Device PCI Domain ID / Bus ID / location ID: %d / %d / %d\n", + deviceProp.pciDomainID, deviceProp.pciBusID, deviceProp.pciDeviceID); + + const char *sComputeMode[] = { + "Default (multiple host threads can use ::cudaSetDevice() with device " + "simultaneously)", + "Exclusive (only one host thread in one process is able to use " + "::cudaSetDevice() with this device)", + "Prohibited (no host thread can use ::cudaSetDevice() with this " + "device)", + "Exclusive Process (many threads in one process is able to use " + "::cudaSetDevice() with this device)", + "Unknown", + NULL}; + printf(" Compute Mode:\n"); + printf(" < %s >\n", sComputeMode[deviceProp.computeMode]); + } + + // If there are 2 or more GPUs, query to determine whether RDMA is supported + if (deviceCount >= 2) { + cudaDeviceProp prop[64]; + int gpuid[64]; // we want to find the first two GPUs that can support P2P + int gpu_p2p_count = 0; + + for (int i = 0; i < deviceCount; i++) { + checkCudaErrors(cudaGetDeviceProperties(&prop[i], i)); + + // Only boards based on Fermi or later can support P2P + if ((prop[i].major >= 2) +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) + // on Windows (64-bit), the Tesla Compute Cluster driver for windows + // must be enabled to support this + && prop[i].tccDriver +#endif + ) { + // This is an array of P2P capable GPUs + gpuid[gpu_p2p_count++] = i; + } + } + + // Show all the combinations of support P2P GPUs + int can_access_peer; + + if (gpu_p2p_count >= 2) { + for (int i = 0; i < gpu_p2p_count; i++) { + for (int j = 0; j < gpu_p2p_count; j++) { + if (gpuid[i] == gpuid[j]) { + continue; + } + checkCudaErrors( + cudaDeviceCanAccessPeer(&can_access_peer, gpuid[i], gpuid[j])); + printf("> Peer access from %s (GPU%d) -> %s (GPU%d) : %s\n", + prop[gpuid[i]].name, gpuid[i], prop[gpuid[j]].name, gpuid[j], + can_access_peer ? "Yes" : "No"); + } + } + } + } + + // csv masterlog info + // ***************************** + // exe and CUDA driver name + printf("\n"); + std::string sProfileString = "deviceQuery, CUDA Driver = CUDART"; + char cTemp[16]; + + // driver version + sProfileString += ", CUDA Driver Version = "; +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) + sprintf_s(cTemp, 10, "%d.%d", driverVersion/1000, (driverVersion%100)/10); +#else + snprintf(cTemp, sizeof(cTemp), "%d.%d", driverVersion / 1000, + (driverVersion % 100) / 10); +#endif + sProfileString += cTemp; + + // Runtime version + sProfileString += ", CUDA Runtime Version = "; +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) + sprintf_s(cTemp, 10, "%d.%d", runtimeVersion/1000, (runtimeVersion%100)/10); +#else + snprintf(cTemp, sizeof(cTemp), "%d.%d", runtimeVersion / 1000, + (runtimeVersion % 100) / 10); +#endif + sProfileString += cTemp; + + // Device count + sProfileString += ", NumDevs = "; +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) + sprintf_s(cTemp, 10, "%d", deviceCount); +#else + snprintf(cTemp, sizeof(cTemp), "%d", deviceCount); +#endif + sProfileString += cTemp; + sProfileString += "\n"; + printf("%s", sProfileString.c_str()); + + printf("Result = PASS\n"); + + // finish + exit(EXIT_SUCCESS); +} diff --git a/deviceQuery/deviceQuery.o b/deviceQuery/deviceQuery.o new file mode 100644 index 0000000000000000000000000000000000000000..345cfd80b4d8b2ea3b06ce1be7c6f9dded35f916 GIT binary patch literal 16984 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 D`X}n5 literal 0 HcmV?d00001 diff --git a/deviceQuery/inc/helper_cuda.h b/deviceQuery/inc/helper_cuda.h new file mode 100644 index 0000000..efdf39f --- /dev/null +++ b/deviceQuery/inc/helper_cuda.h @@ -0,0 +1,951 @@ +/** + * Copyright 1993-2017 NVIDIA Corporation. All rights reserved. + * + * Please refer to the NVIDIA end user license agreement (EULA) associated + * with this source code for terms and conditions that govern your use of + * this software. Any use, reproduction, disclosure, or distribution of + * this software and related documentation outside the terms of the EULA + * is strictly prohibited. + * + */ + +//////////////////////////////////////////////////////////////////////////////// +// These are CUDA Helper functions for initialization and error checking + +#ifndef COMMON_HELPER_CUDA_H_ +#define COMMON_HELPER_CUDA_H_ + +#pragma once + +#include +#include +#include +#include + +#include + +#ifndef EXIT_WAIVED +#define EXIT_WAIVED 2 +#endif + +// Note, it is required that your SDK sample to include the proper header +// files, please refer the CUDA examples for examples of the needed CUDA +// headers, which may change depending on which CUDA functions are used. + +// CUDA Runtime error messages +#ifdef __DRIVER_TYPES_H__ +static const char *_cudaGetErrorEnum(cudaError_t error) { + return cudaGetErrorName(error); +} +#endif + +#ifdef CUDA_DRIVER_API +// CUDA Driver API errors +static const char *_cudaGetErrorEnum(CUresult error) { + static char unknown[] = ""; + const char *ret = NULL; + cuGetErrorName(error, &ret); + return ret ? ret : unknown; +} +#endif + +#ifdef CUBLAS_API_H_ +// cuBLAS API errors +static const char *_cudaGetErrorEnum(cublasStatus_t error) { + switch (error) { + case CUBLAS_STATUS_SUCCESS: + return "CUBLAS_STATUS_SUCCESS"; + + case CUBLAS_STATUS_NOT_INITIALIZED: + return "CUBLAS_STATUS_NOT_INITIALIZED"; + + case CUBLAS_STATUS_ALLOC_FAILED: + return "CUBLAS_STATUS_ALLOC_FAILED"; + + case CUBLAS_STATUS_INVALID_VALUE: + return "CUBLAS_STATUS_INVALID_VALUE"; + + case CUBLAS_STATUS_ARCH_MISMATCH: + return "CUBLAS_STATUS_ARCH_MISMATCH"; + + case CUBLAS_STATUS_MAPPING_ERROR: + return "CUBLAS_STATUS_MAPPING_ERROR"; + + case CUBLAS_STATUS_EXECUTION_FAILED: + return "CUBLAS_STATUS_EXECUTION_FAILED"; + + case CUBLAS_STATUS_INTERNAL_ERROR: + return "CUBLAS_STATUS_INTERNAL_ERROR"; + + case CUBLAS_STATUS_NOT_SUPPORTED: + return "CUBLAS_STATUS_NOT_SUPPORTED"; + + case CUBLAS_STATUS_LICENSE_ERROR: + return "CUBLAS_STATUS_LICENSE_ERROR"; + } + + return ""; +} +#endif + +#ifdef _CUFFT_H_ +// cuFFT API errors +static const char *_cudaGetErrorEnum(cufftResult error) { + switch (error) { + case CUFFT_SUCCESS: + return "CUFFT_SUCCESS"; + + case CUFFT_INVALID_PLAN: + return "CUFFT_INVALID_PLAN"; + + case CUFFT_ALLOC_FAILED: + return "CUFFT_ALLOC_FAILED"; + + case CUFFT_INVALID_TYPE: + return "CUFFT_INVALID_TYPE"; + + case CUFFT_INVALID_VALUE: + return "CUFFT_INVALID_VALUE"; + + case CUFFT_INTERNAL_ERROR: + return "CUFFT_INTERNAL_ERROR"; + + case CUFFT_EXEC_FAILED: + return "CUFFT_EXEC_FAILED"; + + case CUFFT_SETUP_FAILED: + return "CUFFT_SETUP_FAILED"; + + case CUFFT_INVALID_SIZE: + return "CUFFT_INVALID_SIZE"; + + case CUFFT_UNALIGNED_DATA: + return "CUFFT_UNALIGNED_DATA"; + + case CUFFT_INCOMPLETE_PARAMETER_LIST: + return "CUFFT_INCOMPLETE_PARAMETER_LIST"; + + case CUFFT_INVALID_DEVICE: + return "CUFFT_INVALID_DEVICE"; + + case CUFFT_PARSE_ERROR: + return "CUFFT_PARSE_ERROR"; + + case CUFFT_NO_WORKSPACE: + return "CUFFT_NO_WORKSPACE"; + + case CUFFT_NOT_IMPLEMENTED: + return "CUFFT_NOT_IMPLEMENTED"; + + case CUFFT_LICENSE_ERROR: + return "CUFFT_LICENSE_ERROR"; + + case CUFFT_NOT_SUPPORTED: + return "CUFFT_NOT_SUPPORTED"; + } + + return ""; +} +#endif + +#ifdef CUSPARSEAPI +// cuSPARSE API errors +static const char *_cudaGetErrorEnum(cusparseStatus_t error) { + switch (error) { + case CUSPARSE_STATUS_SUCCESS: + return "CUSPARSE_STATUS_SUCCESS"; + + case CUSPARSE_STATUS_NOT_INITIALIZED: + return "CUSPARSE_STATUS_NOT_INITIALIZED"; + + case CUSPARSE_STATUS_ALLOC_FAILED: + return "CUSPARSE_STATUS_ALLOC_FAILED"; + + case CUSPARSE_STATUS_INVALID_VALUE: + return "CUSPARSE_STATUS_INVALID_VALUE"; + + case CUSPARSE_STATUS_ARCH_MISMATCH: + return "CUSPARSE_STATUS_ARCH_MISMATCH"; + + case CUSPARSE_STATUS_MAPPING_ERROR: + return "CUSPARSE_STATUS_MAPPING_ERROR"; + + case CUSPARSE_STATUS_EXECUTION_FAILED: + return "CUSPARSE_STATUS_EXECUTION_FAILED"; + + case CUSPARSE_STATUS_INTERNAL_ERROR: + return "CUSPARSE_STATUS_INTERNAL_ERROR"; + + case CUSPARSE_STATUS_MATRIX_TYPE_NOT_SUPPORTED: + return "CUSPARSE_STATUS_MATRIX_TYPE_NOT_SUPPORTED"; + } + + return ""; +} +#endif + +#ifdef CUSOLVER_COMMON_H_ +// cuSOLVER API errors +static const char *_cudaGetErrorEnum(cusolverStatus_t error) { + switch (error) { + case CUSOLVER_STATUS_SUCCESS: + return "CUSOLVER_STATUS_SUCCESS"; + case CUSOLVER_STATUS_NOT_INITIALIZED: + return "CUSOLVER_STATUS_NOT_INITIALIZED"; + case CUSOLVER_STATUS_ALLOC_FAILED: + return "CUSOLVER_STATUS_ALLOC_FAILED"; + case CUSOLVER_STATUS_INVALID_VALUE: + return "CUSOLVER_STATUS_INVALID_VALUE"; + case CUSOLVER_STATUS_ARCH_MISMATCH: + return "CUSOLVER_STATUS_ARCH_MISMATCH"; + case CUSOLVER_STATUS_MAPPING_ERROR: + return "CUSOLVER_STATUS_MAPPING_ERROR"; + case CUSOLVER_STATUS_EXECUTION_FAILED: + return "CUSOLVER_STATUS_EXECUTION_FAILED"; + case CUSOLVER_STATUS_INTERNAL_ERROR: + return "CUSOLVER_STATUS_INTERNAL_ERROR"; + case CUSOLVER_STATUS_MATRIX_TYPE_NOT_SUPPORTED: + return "CUSOLVER_STATUS_MATRIX_TYPE_NOT_SUPPORTED"; + case CUSOLVER_STATUS_NOT_SUPPORTED: + return "CUSOLVER_STATUS_NOT_SUPPORTED "; + case CUSOLVER_STATUS_ZERO_PIVOT: + return "CUSOLVER_STATUS_ZERO_PIVOT"; + case CUSOLVER_STATUS_INVALID_LICENSE: + return "CUSOLVER_STATUS_INVALID_LICENSE"; + } + + return ""; +} +#endif + +#ifdef CURAND_H_ +// cuRAND API errors +static const char *_cudaGetErrorEnum(curandStatus_t error) { + switch (error) { + case CURAND_STATUS_SUCCESS: + return "CURAND_STATUS_SUCCESS"; + + case CURAND_STATUS_VERSION_MISMATCH: + return "CURAND_STATUS_VERSION_MISMATCH"; + + case CURAND_STATUS_NOT_INITIALIZED: + return "CURAND_STATUS_NOT_INITIALIZED"; + + case CURAND_STATUS_ALLOCATION_FAILED: + return "CURAND_STATUS_ALLOCATION_FAILED"; + + case CURAND_STATUS_TYPE_ERROR: + return "CURAND_STATUS_TYPE_ERROR"; + + case CURAND_STATUS_OUT_OF_RANGE: + return "CURAND_STATUS_OUT_OF_RANGE"; + + case CURAND_STATUS_LENGTH_NOT_MULTIPLE: + return "CURAND_STATUS_LENGTH_NOT_MULTIPLE"; + + case CURAND_STATUS_DOUBLE_PRECISION_REQUIRED: + return "CURAND_STATUS_DOUBLE_PRECISION_REQUIRED"; + + case CURAND_STATUS_LAUNCH_FAILURE: + return "CURAND_STATUS_LAUNCH_FAILURE"; + + case CURAND_STATUS_PREEXISTING_FAILURE: + return "CURAND_STATUS_PREEXISTING_FAILURE"; + + case CURAND_STATUS_INITIALIZATION_FAILED: + return "CURAND_STATUS_INITIALIZATION_FAILED"; + + case CURAND_STATUS_ARCH_MISMATCH: + return "CURAND_STATUS_ARCH_MISMATCH"; + + case CURAND_STATUS_INTERNAL_ERROR: + return "CURAND_STATUS_INTERNAL_ERROR"; + } + + return ""; +} +#endif + +#ifdef NVJPEGAPI +// nvJPEG API errors +static const char *_cudaGetErrorEnum(nvjpegStatus_t error) { + switch (error) { + case NVJPEG_STATUS_SUCCESS: + return "NVJPEG_STATUS_SUCCESS"; + + case NVJPEG_STATUS_NOT_INITIALIZED: + return "NVJPEG_STATUS_NOT_INITIALIZED"; + + case NVJPEG_STATUS_INVALID_PARAMETER: + return "NVJPEG_STATUS_INVALID_PARAMETER"; + + case NVJPEG_STATUS_BAD_JPEG: + return "NVJPEG_STATUS_BAD_JPEG"; + + case NVJPEG_STATUS_JPEG_NOT_SUPPORTED: + return "NVJPEG_STATUS_JPEG_NOT_SUPPORTED"; + + case NVJPEG_STATUS_ALLOCATOR_FAILURE: + return "NVJPEG_STATUS_ALLOCATOR_FAILURE"; + + case NVJPEG_STATUS_EXECUTION_FAILED: + return "NVJPEG_STATUS_EXECUTION_FAILED"; + + case NVJPEG_STATUS_ARCH_MISMATCH: + return "NVJPEG_STATUS_ARCH_MISMATCH"; + + case NVJPEG_STATUS_INTERNAL_ERROR: + return "NVJPEG_STATUS_INTERNAL_ERROR"; + } + + return ""; +} +#endif + +#ifdef NV_NPPIDEFS_H +// NPP API errors +static const char *_cudaGetErrorEnum(NppStatus error) { + switch (error) { + case NPP_NOT_SUPPORTED_MODE_ERROR: + return "NPP_NOT_SUPPORTED_MODE_ERROR"; + + case NPP_ROUND_MODE_NOT_SUPPORTED_ERROR: + return "NPP_ROUND_MODE_NOT_SUPPORTED_ERROR"; + + case NPP_RESIZE_NO_OPERATION_ERROR: + return "NPP_RESIZE_NO_OPERATION_ERROR"; + + case NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY: + return "NPP_NOT_SUFFICIENT_COMPUTE_CAPABILITY"; + +#if ((NPP_VERSION_MAJOR << 12) + (NPP_VERSION_MINOR << 4)) <= 0x5000 + + case NPP_BAD_ARG_ERROR: + return "NPP_BAD_ARGUMENT_ERROR"; + + case NPP_COEFF_ERROR: + return "NPP_COEFFICIENT_ERROR"; + + case NPP_RECT_ERROR: + return "NPP_RECTANGLE_ERROR"; + + case NPP_QUAD_ERROR: + return "NPP_QUADRANGLE_ERROR"; + + case NPP_MEM_ALLOC_ERR: + return "NPP_MEMORY_ALLOCATION_ERROR"; + + case NPP_HISTO_NUMBER_OF_LEVELS_ERROR: + return "NPP_HISTOGRAM_NUMBER_OF_LEVELS_ERROR"; + + case NPP_INVALID_INPUT: + return "NPP_INVALID_INPUT"; + + case NPP_POINTER_ERROR: + return "NPP_POINTER_ERROR"; + + case NPP_WARNING: + return "NPP_WARNING"; + + case NPP_ODD_ROI_WARNING: + return "NPP_ODD_ROI_WARNING"; +#else + + // These are for CUDA 5.5 or higher + case NPP_BAD_ARGUMENT_ERROR: + return "NPP_BAD_ARGUMENT_ERROR"; + + case NPP_COEFFICIENT_ERROR: + return "NPP_COEFFICIENT_ERROR"; + + case NPP_RECTANGLE_ERROR: + return "NPP_RECTANGLE_ERROR"; + + case NPP_QUADRANGLE_ERROR: + return "NPP_QUADRANGLE_ERROR"; + + case NPP_MEMORY_ALLOCATION_ERR: + return "NPP_MEMORY_ALLOCATION_ERROR"; + + case NPP_HISTOGRAM_NUMBER_OF_LEVELS_ERROR: + return "NPP_HISTOGRAM_NUMBER_OF_LEVELS_ERROR"; + + case NPP_INVALID_HOST_POINTER_ERROR: + return "NPP_INVALID_HOST_POINTER_ERROR"; + + case NPP_INVALID_DEVICE_POINTER_ERROR: + return "NPP_INVALID_DEVICE_POINTER_ERROR"; +#endif + + case NPP_LUT_NUMBER_OF_LEVELS_ERROR: + return "NPP_LUT_NUMBER_OF_LEVELS_ERROR"; + + case NPP_TEXTURE_BIND_ERROR: + return "NPP_TEXTURE_BIND_ERROR"; + + case NPP_WRONG_INTERSECTION_ROI_ERROR: + return "NPP_WRONG_INTERSECTION_ROI_ERROR"; + + case NPP_NOT_EVEN_STEP_ERROR: + return "NPP_NOT_EVEN_STEP_ERROR"; + + case NPP_INTERPOLATION_ERROR: + return "NPP_INTERPOLATION_ERROR"; + + case NPP_RESIZE_FACTOR_ERROR: + return "NPP_RESIZE_FACTOR_ERROR"; + + case NPP_HAAR_CLASSIFIER_PIXEL_MATCH_ERROR: + return "NPP_HAAR_CLASSIFIER_PIXEL_MATCH_ERROR"; + +#if ((NPP_VERSION_MAJOR << 12) + (NPP_VERSION_MINOR << 4)) <= 0x5000 + + case NPP_MEMFREE_ERR: + return "NPP_MEMFREE_ERR"; + + case NPP_MEMSET_ERR: + return "NPP_MEMSET_ERR"; + + case NPP_MEMCPY_ERR: + return "NPP_MEMCPY_ERROR"; + + case NPP_MIRROR_FLIP_ERR: + return "NPP_MIRROR_FLIP_ERR"; +#else + + case NPP_MEMFREE_ERROR: + return "NPP_MEMFREE_ERROR"; + + case NPP_MEMSET_ERROR: + return "NPP_MEMSET_ERROR"; + + case NPP_MEMCPY_ERROR: + return "NPP_MEMCPY_ERROR"; + + case NPP_MIRROR_FLIP_ERROR: + return "NPP_MIRROR_FLIP_ERROR"; +#endif + + case NPP_ALIGNMENT_ERROR: + return "NPP_ALIGNMENT_ERROR"; + + case NPP_STEP_ERROR: + return "NPP_STEP_ERROR"; + + case NPP_SIZE_ERROR: + return "NPP_SIZE_ERROR"; + + case NPP_NULL_POINTER_ERROR: + return "NPP_NULL_POINTER_ERROR"; + + case NPP_CUDA_KERNEL_EXECUTION_ERROR: + return "NPP_CUDA_KERNEL_EXECUTION_ERROR"; + + case NPP_NOT_IMPLEMENTED_ERROR: + return "NPP_NOT_IMPLEMENTED_ERROR"; + + case NPP_ERROR: + return "NPP_ERROR"; + + case NPP_SUCCESS: + return "NPP_SUCCESS"; + + case NPP_WRONG_INTERSECTION_QUAD_WARNING: + return "NPP_WRONG_INTERSECTION_QUAD_WARNING"; + + case NPP_MISALIGNED_DST_ROI_WARNING: + return "NPP_MISALIGNED_DST_ROI_WARNING"; + + case NPP_AFFINE_QUAD_INCORRECT_WARNING: + return "NPP_AFFINE_QUAD_INCORRECT_WARNING"; + + case NPP_DOUBLE_SIZE_WARNING: + return "NPP_DOUBLE_SIZE_WARNING"; + + case NPP_WRONG_INTERSECTION_ROI_WARNING: + return "NPP_WRONG_INTERSECTION_ROI_WARNING"; + +#if ((NPP_VERSION_MAJOR << 12) + (NPP_VERSION_MINOR << 4)) >= 0x6000 + /* These are 6.0 or higher */ + case NPP_LUT_PALETTE_BITSIZE_ERROR: + return "NPP_LUT_PALETTE_BITSIZE_ERROR"; + + case NPP_ZC_MODE_NOT_SUPPORTED_ERROR: + return "NPP_ZC_MODE_NOT_SUPPORTED_ERROR"; + + case NPP_QUALITY_INDEX_ERROR: + return "NPP_QUALITY_INDEX_ERROR"; + + case NPP_CHANNEL_ORDER_ERROR: + return "NPP_CHANNEL_ORDER_ERROR"; + + case NPP_ZERO_MASK_VALUE_ERROR: + return "NPP_ZERO_MASK_VALUE_ERROR"; + + case NPP_NUMBER_OF_CHANNELS_ERROR: + return "NPP_NUMBER_OF_CHANNELS_ERROR"; + + case NPP_COI_ERROR: + return "NPP_COI_ERROR"; + + case NPP_DIVISOR_ERROR: + return "NPP_DIVISOR_ERROR"; + + case NPP_CHANNEL_ERROR: + return "NPP_CHANNEL_ERROR"; + + case NPP_STRIDE_ERROR: + return "NPP_STRIDE_ERROR"; + + case NPP_ANCHOR_ERROR: + return "NPP_ANCHOR_ERROR"; + + case NPP_MASK_SIZE_ERROR: + return "NPP_MASK_SIZE_ERROR"; + + case NPP_MOMENT_00_ZERO_ERROR: + return "NPP_MOMENT_00_ZERO_ERROR"; + + case NPP_THRESHOLD_NEGATIVE_LEVEL_ERROR: + return "NPP_THRESHOLD_NEGATIVE_LEVEL_ERROR"; + + case NPP_THRESHOLD_ERROR: + return "NPP_THRESHOLD_ERROR"; + + case NPP_CONTEXT_MATCH_ERROR: + return "NPP_CONTEXT_MATCH_ERROR"; + + case NPP_FFT_FLAG_ERROR: + return "NPP_FFT_FLAG_ERROR"; + + case NPP_FFT_ORDER_ERROR: + return "NPP_FFT_ORDER_ERROR"; + + case NPP_SCALE_RANGE_ERROR: + return "NPP_SCALE_RANGE_ERROR"; + + case NPP_DATA_TYPE_ERROR: + return "NPP_DATA_TYPE_ERROR"; + + case NPP_OUT_OFF_RANGE_ERROR: + return "NPP_OUT_OFF_RANGE_ERROR"; + + case NPP_DIVIDE_BY_ZERO_ERROR: + return "NPP_DIVIDE_BY_ZERO_ERROR"; + + case NPP_RANGE_ERROR: + return "NPP_RANGE_ERROR"; + + case NPP_NO_MEMORY_ERROR: + return "NPP_NO_MEMORY_ERROR"; + + case NPP_ERROR_RESERVED: + return "NPP_ERROR_RESERVED"; + + case NPP_NO_OPERATION_WARNING: + return "NPP_NO_OPERATION_WARNING"; + + case NPP_DIVIDE_BY_ZERO_WARNING: + return "NPP_DIVIDE_BY_ZERO_WARNING"; +#endif + +#if ((NPP_VERSION_MAJOR << 12) + (NPP_VERSION_MINOR << 4)) >= 0x7000 + /* These are 7.0 or higher */ + case NPP_OVERFLOW_ERROR: + return "NPP_OVERFLOW_ERROR"; + + case NPP_CORRUPTED_DATA_ERROR: + return "NPP_CORRUPTED_DATA_ERROR"; +#endif + } + + return ""; +} +#endif + +template +void check(T result, char const *const func, const char *const file, + int const line) { + if (result) { + fprintf(stderr, "CUDA error at %s:%d code=%d(%s) \"%s\" \n", file, line, + static_cast(result), _cudaGetErrorEnum(result), func); + exit(EXIT_FAILURE); + } +} + +#ifdef __DRIVER_TYPES_H__ +// This will output the proper CUDA error strings in the event +// that a CUDA host call returns an error +#define checkCudaErrors(val) check((val), #val, __FILE__, __LINE__) + +// This will output the proper error string when calling cudaGetLastError +#define getLastCudaError(msg) __getLastCudaError(msg, __FILE__, __LINE__) + +inline void __getLastCudaError(const char *errorMessage, const char *file, + const int line) { + cudaError_t err = cudaGetLastError(); + + if (cudaSuccess != err) { + fprintf(stderr, + "%s(%i) : getLastCudaError() CUDA error :" + " %s : (%d) %s.\n", + file, line, errorMessage, static_cast(err), + cudaGetErrorString(err)); + exit(EXIT_FAILURE); + } +} + +// This will only print the proper error string when calling cudaGetLastError +// but not exit program incase error detected. +#define printLastCudaError(msg) __printLastCudaError(msg, __FILE__, __LINE__) + +inline void __printLastCudaError(const char *errorMessage, const char *file, + const int line) { + cudaError_t err = cudaGetLastError(); + + if (cudaSuccess != err) { + fprintf(stderr, + "%s(%i) : getLastCudaError() CUDA error :" + " %s : (%d) %s.\n", + file, line, errorMessage, static_cast(err), + cudaGetErrorString(err)); + } +} +#endif + +#ifndef MAX +#define MAX(a, b) (a > b ? a : b) +#endif + +// Float To Int conversion +inline int ftoi(float value) { + return (value >= 0 ? static_cast(value + 0.5) + : static_cast(value - 0.5)); +} + +// Beginning of GPU Architecture definitions +inline int _ConvertSMVer2Cores(int major, int minor) { + // Defines for GPU Architecture types (using the SM version to determine + // the # of cores per SM + typedef struct { + int SM; // 0xMm (hexidecimal notation), M = SM Major version, + // and m = SM minor version + int Cores; + } sSMtoCores; + + sSMtoCores nGpuArchCoresPerSM[] = { + {0x30, 192}, + {0x32, 192}, + {0x35, 192}, + {0x37, 192}, + {0x50, 128}, + {0x52, 128}, + {0x53, 128}, + {0x60, 64}, + {0x61, 128}, + {0x62, 128}, + {0x70, 64}, + {0x72, 64}, + {0x75, 64}, + {0x80, 64}, + {0x86, 128}, + {-1, -1}}; + + int index = 0; + + while (nGpuArchCoresPerSM[index].SM != -1) { + if (nGpuArchCoresPerSM[index].SM == ((major << 4) + minor)) { + return nGpuArchCoresPerSM[index].Cores; + } + + index++; + } + + // If we don't find the values, we default use the previous one + // to run properly + printf( + "MapSMtoCores for SM %d.%d is undefined." + " Default to use %d Cores/SM\n", + major, minor, nGpuArchCoresPerSM[index - 1].Cores); + return nGpuArchCoresPerSM[index - 1].Cores; +} + +inline const char* _ConvertSMVer2ArchName(int major, int minor) { + // Defines for GPU Architecture types (using the SM version to determine + // the GPU Arch name) + typedef struct { + int SM; // 0xMm (hexidecimal notation), M = SM Major version, + // and m = SM minor version + const char* name; + } sSMtoArchName; + + sSMtoArchName nGpuArchNameSM[] = { + {0x30, "Kepler"}, + {0x32, "Kepler"}, + {0x35, "Kepler"}, + {0x37, "Kepler"}, + {0x50, "Maxwell"}, + {0x52, "Maxwell"}, + {0x53, "Maxwell"}, + {0x60, "Pascal"}, + {0x61, "Pascal"}, + {0x62, "Pascal"}, + {0x70, "Volta"}, + {0x72, "Xavier"}, + {0x75, "Turing"}, + {0x80, "Ampere"}, + {0x86, "Ampere"}, + {-1, "Graphics Device"}}; + + int index = 0; + + while (nGpuArchNameSM[index].SM != -1) { + if (nGpuArchNameSM[index].SM == ((major << 4) + minor)) { + return nGpuArchNameSM[index].name; + } + + index++; + } + + // If we don't find the values, we default use the previous one + // to run properly + printf( + "MapSMtoArchName for SM %d.%d is undefined." + " Default to use %s\n", + major, minor, nGpuArchNameSM[index - 1].name); + return nGpuArchNameSM[index - 1].name; +} + // end of GPU Architecture definitions + +#ifdef __CUDA_RUNTIME_H__ +// General GPU Device CUDA Initialization +inline int gpuDeviceInit(int devID) { + int device_count; + checkCudaErrors(cudaGetDeviceCount(&device_count)); + + if (device_count == 0) { + fprintf(stderr, + "gpuDeviceInit() CUDA error: " + "no devices supporting CUDA.\n"); + exit(EXIT_FAILURE); + } + + if (devID < 0) { + devID = 0; + } + + if (devID > device_count - 1) { + fprintf(stderr, "\n"); + fprintf(stderr, ">> %d CUDA capable GPU device(s) detected. <<\n", + device_count); + fprintf(stderr, + ">> gpuDeviceInit (-device=%d) is not a valid" + " GPU device. <<\n", + devID); + fprintf(stderr, "\n"); + return -devID; + } + + int computeMode = -1, major = 0, minor = 0; + checkCudaErrors(cudaDeviceGetAttribute(&computeMode, cudaDevAttrComputeMode, devID)); + checkCudaErrors(cudaDeviceGetAttribute(&major, cudaDevAttrComputeCapabilityMajor, devID)); + checkCudaErrors(cudaDeviceGetAttribute(&minor, cudaDevAttrComputeCapabilityMinor, devID)); + if (computeMode == cudaComputeModeProhibited) { + fprintf(stderr, + "Error: device is running in , no threads can use cudaSetDevice().\n"); + return -1; + } + + if (major < 1) { + fprintf(stderr, "gpuDeviceInit(): GPU device does not support CUDA.\n"); + exit(EXIT_FAILURE); + } + + checkCudaErrors(cudaSetDevice(devID)); + printf("gpuDeviceInit() CUDA Device [%d]: \"%s\n", devID, _ConvertSMVer2ArchName(major, minor)); + + return devID; +} + +// This function returns the best GPU (with maximum GFLOPS) +inline int gpuGetMaxGflopsDeviceId() { + int current_device = 0, sm_per_multiproc = 0; + int max_perf_device = 0; + int device_count = 0; + int devices_prohibited = 0; + + uint64_t max_compute_perf = 0; + checkCudaErrors(cudaGetDeviceCount(&device_count)); + + if (device_count == 0) { + fprintf(stderr, + "gpuGetMaxGflopsDeviceId() CUDA error:" + " no devices supporting CUDA.\n"); + exit(EXIT_FAILURE); + } + + // Find the best CUDA capable GPU device + current_device = 0; + + while (current_device < device_count) { + int computeMode = -1, major = 0, minor = 0; + checkCudaErrors(cudaDeviceGetAttribute(&computeMode, cudaDevAttrComputeMode, current_device)); + checkCudaErrors(cudaDeviceGetAttribute(&major, cudaDevAttrComputeCapabilityMajor, current_device)); + checkCudaErrors(cudaDeviceGetAttribute(&minor, cudaDevAttrComputeCapabilityMinor, current_device)); + + // If this GPU is not running on Compute Mode prohibited, + // then we can add it to the list + if (computeMode != cudaComputeModeProhibited) { + if (major == 9999 && minor == 9999) { + sm_per_multiproc = 1; + } else { + sm_per_multiproc = + _ConvertSMVer2Cores(major, minor); + } + int multiProcessorCount = 0, clockRate = 0; + checkCudaErrors(cudaDeviceGetAttribute(&multiProcessorCount, cudaDevAttrMultiProcessorCount, current_device)); + cudaError_t result = cudaDeviceGetAttribute(&clockRate, cudaDevAttrClockRate, current_device); + if (result != cudaSuccess) { + // If cudaDevAttrClockRate attribute is not supported we + // set clockRate as 1, to consider GPU with most SMs and CUDA Cores. + if(result == cudaErrorInvalidValue) { + clockRate = 1; + } + else { + fprintf(stderr, "CUDA error at %s:%d code=%d(%s) \n", __FILE__, __LINE__, + static_cast(result), _cudaGetErrorEnum(result)); + exit(EXIT_FAILURE); + } + } + uint64_t compute_perf = (uint64_t)multiProcessorCount * sm_per_multiproc * clockRate; + + if (compute_perf > max_compute_perf) { + max_compute_perf = compute_perf; + max_perf_device = current_device; + } + } else { + devices_prohibited++; + } + + ++current_device; + } + + if (devices_prohibited == device_count) { + fprintf(stderr, + "gpuGetMaxGflopsDeviceId() CUDA error:" + " all devices have compute mode prohibited.\n"); + exit(EXIT_FAILURE); + } + + return max_perf_device; +} + +// Initialization code to find the best CUDA Device +inline int findCudaDevice(int argc, const char **argv) { + int devID = 0; + + // If the command-line has a device number specified, use it + if (checkCmdLineFlag(argc, argv, "device")) { + devID = getCmdLineArgumentInt(argc, argv, "device="); + + if (devID < 0) { + printf("Invalid command line parameter\n "); + exit(EXIT_FAILURE); + } else { + devID = gpuDeviceInit(devID); + + if (devID < 0) { + printf("exiting...\n"); + exit(EXIT_FAILURE); + } + } + } else { + // Otherwise pick the device with highest Gflops/s + devID = gpuGetMaxGflopsDeviceId(); + checkCudaErrors(cudaSetDevice(devID)); + int major = 0, minor = 0; + checkCudaErrors(cudaDeviceGetAttribute(&major, cudaDevAttrComputeCapabilityMajor, devID)); + checkCudaErrors(cudaDeviceGetAttribute(&minor, cudaDevAttrComputeCapabilityMinor, devID)); + printf("GPU Device %d: \"%s\" with compute capability %d.%d\n\n", + devID, _ConvertSMVer2ArchName(major, minor), major, minor); + + } + + return devID; +} + +inline int findIntegratedGPU() { + int current_device = 0; + int device_count = 0; + int devices_prohibited = 0; + + checkCudaErrors(cudaGetDeviceCount(&device_count)); + + if (device_count == 0) { + fprintf(stderr, "CUDA error: no devices supporting CUDA.\n"); + exit(EXIT_FAILURE); + } + + // Find the integrated GPU which is compute capable + while (current_device < device_count) { + int computeMode = -1, integrated = -1; + checkCudaErrors(cudaDeviceGetAttribute(&computeMode, cudaDevAttrComputeMode, current_device)); + checkCudaErrors(cudaDeviceGetAttribute(&integrated, cudaDevAttrIntegrated, current_device)); + // If GPU is integrated and is not running on Compute Mode prohibited, + // then cuda can map to GLES resource + if (integrated && (computeMode != cudaComputeModeProhibited)) { + checkCudaErrors(cudaSetDevice(current_device)); + + int major = 0, minor = 0; + checkCudaErrors(cudaDeviceGetAttribute(&major, cudaDevAttrComputeCapabilityMajor, current_device)); + checkCudaErrors(cudaDeviceGetAttribute(&minor, cudaDevAttrComputeCapabilityMinor, current_device)); + printf("GPU Device %d: \"%s\" with compute capability %d.%d\n\n", + current_device, _ConvertSMVer2ArchName(major, minor), major, minor); + + return current_device; + } else { + devices_prohibited++; + } + + current_device++; + } + + if (devices_prohibited == device_count) { + fprintf(stderr, + "CUDA error:" + " No GLES-CUDA Interop capable GPU found.\n"); + exit(EXIT_FAILURE); + } + + return -1; +} + +// General check for CUDA GPU SM Capabilities +inline bool checkCudaCapabilities(int major_version, int minor_version) { + int dev; + int major = 0, minor = 0; + + checkCudaErrors(cudaGetDevice(&dev)); + checkCudaErrors(cudaDeviceGetAttribute(&major, cudaDevAttrComputeCapabilityMajor, dev)); + checkCudaErrors(cudaDeviceGetAttribute(&minor, cudaDevAttrComputeCapabilityMinor, dev)); + + if ((major > major_version) || + (major == major_version && + minor >= minor_version)) { + printf(" Device %d: <%16s >, Compute SM %d.%d detected\n", dev, + _ConvertSMVer2ArchName(major, minor), major, minor); + return true; + } else { + printf( + " No GPU device was found that can support " + "CUDA compute capability %d.%d.\n", + major_version, minor_version); + return false; + } +} +#endif + + // end of CUDA Helper Functions + +#endif // COMMON_HELPER_CUDA_H_ diff --git a/deviceQuery/inc/helper_string.h b/deviceQuery/inc/helper_string.h new file mode 100644 index 0000000..77864b8 --- /dev/null +++ b/deviceQuery/inc/helper_string.h @@ -0,0 +1,683 @@ +/** + * Copyright 1993-2013 NVIDIA Corporation. All rights reserved. + * + * Please refer to the NVIDIA end user license agreement (EULA) associated + * with this source code for terms and conditions that govern your use of + * this software. Any use, reproduction, disclosure, or distribution of + * this software and related documentation outside the terms of the EULA + * is strictly prohibited. + * + */ + +// These are helper functions for the SDK samples (string parsing, timers, etc) +#ifndef COMMON_HELPER_STRING_H_ +#define COMMON_HELPER_STRING_H_ + +#include +#include +#include +#include + +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE +#endif +#ifndef STRCASECMP +#define STRCASECMP _stricmp +#endif +#ifndef STRNCASECMP +#define STRNCASECMP _strnicmp +#endif +#ifndef STRCPY +#define STRCPY(sFilePath, nLength, sPath) strcpy_s(sFilePath, nLength, sPath) +#endif + +#ifndef FOPEN +#define FOPEN(fHandle, filename, mode) fopen_s(&fHandle, filename, mode) +#endif +#ifndef FOPEN_FAIL +#define FOPEN_FAIL(result) (result != 0) +#endif +#ifndef SSCANF +#define SSCANF sscanf_s +#endif +#ifndef SPRINTF +#define SPRINTF sprintf_s +#endif +#else // Linux Includes +#include +#include + +#ifndef STRCASECMP +#define STRCASECMP strcasecmp +#endif +#ifndef STRNCASECMP +#define STRNCASECMP strncasecmp +#endif +#ifndef STRCPY +#define STRCPY(sFilePath, nLength, sPath) strcpy(sFilePath, sPath) +#endif + +#ifndef FOPEN +#define FOPEN(fHandle, filename, mode) (fHandle = fopen(filename, mode)) +#endif +#ifndef FOPEN_FAIL +#define FOPEN_FAIL(result) (result == NULL) +#endif +#ifndef SSCANF +#define SSCANF sscanf +#endif +#ifndef SPRINTF +#define SPRINTF sprintf +#endif +#endif + +#ifndef EXIT_WAIVED +#define EXIT_WAIVED 2 +#endif + +// CUDA Utility Helper Functions +inline int stringRemoveDelimiter(char delimiter, const char *string) { + int string_start = 0; + + while (string[string_start] == delimiter) { + string_start++; + } + + if (string_start >= static_cast(strlen(string) - 1)) { + return 0; + } + + return string_start; +} + +inline int getFileExtension(char *filename, char **extension) { + int string_length = static_cast(strlen(filename)); + + while (filename[string_length--] != '.') { + if (string_length == 0) break; + } + + if (string_length > 0) string_length += 2; + + if (string_length == 0) + *extension = NULL; + else + *extension = &filename[string_length]; + + return string_length; +} + +inline bool checkCmdLineFlag(const int argc, const char **argv, + const char *string_ref) { + bool bFound = false; + + if (argc >= 1) { + for (int i = 1; i < argc; i++) { + int string_start = stringRemoveDelimiter('-', argv[i]); + const char *string_argv = &argv[i][string_start]; + + const char *equal_pos = strchr(string_argv, '='); + int argv_length = static_cast( + equal_pos == 0 ? strlen(string_argv) : equal_pos - string_argv); + + int length = static_cast(strlen(string_ref)); + + if (length == argv_length && + !STRNCASECMP(string_argv, string_ref, length)) { + bFound = true; + continue; + } + } + } + + return bFound; +} + +// This function wraps the CUDA Driver API into a template function +template +inline bool getCmdLineArgumentValue(const int argc, const char **argv, + const char *string_ref, T *value) { + bool bFound = false; + + if (argc >= 1) { + for (int i = 1; i < argc; i++) { + int string_start = stringRemoveDelimiter('-', argv[i]); + const char *string_argv = &argv[i][string_start]; + int length = static_cast(strlen(string_ref)); + + if (!STRNCASECMP(string_argv, string_ref, length)) { + if (length + 1 <= static_cast(strlen(string_argv))) { + int auto_inc = (string_argv[length] == '=') ? 1 : 0; + *value = (T)atoi(&string_argv[length + auto_inc]); + } + + bFound = true; + i = argc; + } + } + } + + return bFound; +} + +inline int getCmdLineArgumentInt(const int argc, const char **argv, + const char *string_ref) { + bool bFound = false; + int value = -1; + + if (argc >= 1) { + for (int i = 1; i < argc; i++) { + int string_start = stringRemoveDelimiter('-', argv[i]); + const char *string_argv = &argv[i][string_start]; + int length = static_cast(strlen(string_ref)); + + if (!STRNCASECMP(string_argv, string_ref, length)) { + if (length + 1 <= static_cast(strlen(string_argv))) { + int auto_inc = (string_argv[length] == '=') ? 1 : 0; + value = atoi(&string_argv[length + auto_inc]); + } else { + value = 0; + } + + bFound = true; + continue; + } + } + } + + if (bFound) { + return value; + } else { + return 0; + } +} + +inline float getCmdLineArgumentFloat(const int argc, const char **argv, + const char *string_ref) { + bool bFound = false; + float value = -1; + + if (argc >= 1) { + for (int i = 1; i < argc; i++) { + int string_start = stringRemoveDelimiter('-', argv[i]); + const char *string_argv = &argv[i][string_start]; + int length = static_cast(strlen(string_ref)); + + if (!STRNCASECMP(string_argv, string_ref, length)) { + if (length + 1 <= static_cast(strlen(string_argv))) { + int auto_inc = (string_argv[length] == '=') ? 1 : 0; + value = static_cast(atof(&string_argv[length + auto_inc])); + } else { + value = 0.f; + } + + bFound = true; + continue; + } + } + } + + if (bFound) { + return value; + } else { + return 0; + } +} + +inline bool getCmdLineArgumentString(const int argc, const char **argv, + const char *string_ref, + char **string_retval) { + bool bFound = false; + + if (argc >= 1) { + for (int i = 1; i < argc; i++) { + int string_start = stringRemoveDelimiter('-', argv[i]); + char *string_argv = const_cast(&argv[i][string_start]); + int length = static_cast(strlen(string_ref)); + + if (!STRNCASECMP(string_argv, string_ref, length)) { + *string_retval = &string_argv[length + 1]; + bFound = true; + continue; + } + } + } + + if (!bFound) { + *string_retval = NULL; + } + + return bFound; +} + +////////////////////////////////////////////////////////////////////////////// +//! Find the path for a file assuming that +//! files are found in the searchPath. +//! +//! @return the path if succeeded, otherwise 0 +//! @param filename name of the file +//! @param executable_path optional absolute path of the executable +////////////////////////////////////////////////////////////////////////////// +inline char *sdkFindFilePath(const char *filename, + const char *executable_path) { + // defines a variable that is replaced with the name of the + // executable + + // Typical relative search paths to locate needed companion files (e.g. sample + // input data, or JIT source files) The origin for the relative search may be + // the .exe file, a .bat file launching an .exe, a browser .exe launching the + // .exe or .bat, etc + const char *searchPath[] = { + "./", // same dir + "./_data_files/", + "./common/", // "/common/" subdir + "./common/data/", // "/common/data/" subdir + "./data/", // "/data/" subdir + "./src/", // "/src/" subdir + "./src//data/", // "/src//data/" subdir + "./inc/", // "/inc/" subdir + "./0_Simple/", // "/0_Simple/" subdir + "./1_Utilities/", // "/1_Utilities/" subdir + "./2_Graphics/", // "/2_Graphics/" subdir + "./3_Imaging/", // "/3_Imaging/" subdir + "./4_Finance/", // "/4_Finance/" subdir + "./5_Simulations/", // "/5_Simulations/" subdir + "./6_Advanced/", // "/6_Advanced/" subdir + "./7_CUDALibraries/", // "/7_CUDALibraries/" subdir + "./8_Android/", // "/8_Android/" subdir + "./samples/", // "/samples/" subdir + + "./0_Simple//data/", // "/0_Simple//data/" + // subdir + "./1_Utilities//data/", // "/1_Utilities//data/" + // subdir + "./2_Graphics//data/", // "/2_Graphics//data/" + // subdir + "./3_Imaging//data/", // "/3_Imaging//data/" + // subdir + "./4_Finance//data/", // "/4_Finance//data/" + // subdir + "./5_Simulations//data/", // "/5_Simulations//data/" + // subdir + "./6_Advanced//data/", // "/6_Advanced//data/" + // subdir + "./7_CUDALibraries//", // "/7_CUDALibraries//" + // subdir + "./7_CUDALibraries//data/", // "/7_CUDALibraries//data/" + // subdir + + "../", // up 1 in tree + "../common/", // up 1 in tree, "/common/" subdir + "../common/data/", // up 1 in tree, "/common/data/" subdir + "../data/", // up 1 in tree, "/data/" subdir + "../src/", // up 1 in tree, "/src/" subdir + "../inc/", // up 1 in tree, "/inc/" subdir + + "../0_Simple//data/", // up 1 in tree, + // "/0_Simple//" + // subdir + "../1_Utilities//data/", // up 1 in tree, + // "/1_Utilities//" + // subdir + "../2_Graphics//data/", // up 1 in tree, + // "/2_Graphics//" + // subdir + "../3_Imaging//data/", // up 1 in tree, + // "/3_Imaging//" + // subdir + "../4_Finance//data/", // up 1 in tree, + // "/4_Finance//" + // subdir + "../5_Simulations//data/", // up 1 in tree, + // "/5_Simulations//" + // subdir + "../6_Advanced//data/", // up 1 in tree, + // "/6_Advanced//" + // subdir + "../7_CUDALibraries//data/", // up 1 in tree, + // "/7_CUDALibraries//" + // subdir + "../8_Android//data/", // up 1 in tree, + // "/8_Android//" + // subdir + "../samples//data/", // up 1 in tree, + // "/samples//" + // subdir + "../../", // up 2 in tree + "../../common/", // up 2 in tree, "/common/" subdir + "../../common/data/", // up 2 in tree, "/common/data/" subdir + "../../data/", // up 2 in tree, "/data/" subdir + "../../src/", // up 2 in tree, "/src/" subdir + "../../inc/", // up 2 in tree, "/inc/" subdir + "../../sandbox//data/", // up 2 in tree, + // "/sandbox//" + // subdir + "../../0_Simple//data/", // up 2 in tree, + // "/0_Simple//" + // subdir + "../../1_Utilities//data/", // up 2 in tree, + // "/1_Utilities//" + // subdir + "../../2_Graphics//data/", // up 2 in tree, + // "/2_Graphics//" + // subdir + "../../3_Imaging//data/", // up 2 in tree, + // "/3_Imaging//" + // subdir + "../../4_Finance//data/", // up 2 in tree, + // "/4_Finance//" + // subdir + "../../5_Simulations//data/", // up 2 in tree, + // "/5_Simulations//" + // subdir + "../../6_Advanced//data/", // up 2 in tree, + // "/6_Advanced//" + // subdir + "../../7_CUDALibraries//data/", // up 2 in tree, + // "/7_CUDALibraries//" + // subdir + "../../8_Android//data/", // up 2 in tree, + // "/8_Android//" + // subdir + "../../samples//data/", // up 2 in tree, + // "/samples//" + // subdir + "../../../", // up 3 in tree + "../../../src//", // up 3 in tree, + // "/src//" subdir + "../../../src//data/", // up 3 in tree, + // "/src//data/" + // subdir + "../../../src//src/", // up 3 in tree, + // "/src//src/" + // subdir + "../../../src//inc/", // up 3 in tree, + // "/src//inc/" + // subdir + "../../../sandbox//", // up 3 in tree, + // "/sandbox//" + // subdir + "../../../sandbox//data/", // up 3 in tree, + // "/sandbox//data/" + // subdir + "../../../sandbox//src/", // up 3 in tree, + // "/sandbox//src/" + // subdir + "../../../sandbox//inc/", // up 3 in tree, + // "/sandbox//inc/" + // subdir + "../../../0_Simple//data/", // up 3 in tree, + // "/0_Simple//" + // subdir + "../../../1_Utilities//data/", // up 3 in tree, + // "/1_Utilities//" + // subdir + "../../../2_Graphics//data/", // up 3 in tree, + // "/2_Graphics//" + // subdir + "../../../3_Imaging//data/", // up 3 in tree, + // "/3_Imaging//" + // subdir + "../../../4_Finance//data/", // up 3 in tree, + // "/4_Finance//" + // subdir + "../../../5_Simulations//data/", // up 3 in tree, + // "/5_Simulations//" + // subdir + "../../../6_Advanced//data/", // up 3 in tree, + // "/6_Advanced//" + // subdir + "../../../7_CUDALibraries//data/", // up 3 in tree, + // "/7_CUDALibraries//" + // subdir + "../../../8_Android//data/", // up 3 in tree, + // "/8_Android//" + // subdir + "../../../0_Simple//", // up 3 in tree, + // "/0_Simple//" + // subdir + "../../../1_Utilities//", // up 3 in tree, + // "/1_Utilities//" + // subdir + "../../../2_Graphics//", // up 3 in tree, + // "/2_Graphics//" + // subdir + "../../../3_Imaging//", // up 3 in tree, + // "/3_Imaging//" + // subdir + "../../../4_Finance//", // up 3 in tree, + // "/4_Finance//" + // subdir + "../../../5_Simulations//", // up 3 in tree, + // "/5_Simulations//" + // subdir + "../../../6_Advanced//", // up 3 in tree, + // "/6_Advanced//" + // subdir + "../../../7_CUDALibraries//", // up 3 in tree, + // "/7_CUDALibraries//" + // subdir + "../../../8_Android//", // up 3 in tree, + // "/8_Android//" + // subdir + "../../../samples//data/", // up 3 in tree, + // "/samples//" + // subdir + "../../../common/", // up 3 in tree, "../../../common/" subdir + "../../../common/data/", // up 3 in tree, "../../../common/data/" subdir + "../../../data/", // up 3 in tree, "../../../data/" subdir + "../../../../", // up 4 in tree + "../../../../src//", // up 4 in tree, + // "/src//" subdir + "../../../../src//data/", // up 4 in tree, + // "/src//data/" + // subdir + "../../../../src//src/", // up 4 in tree, + // "/src//src/" + // subdir + "../../../../src//inc/", // up 4 in tree, + // "/src//inc/" + // subdir + "../../../../sandbox//", // up 4 in tree, + // "/sandbox//" + // subdir + "../../../../sandbox//data/", // up 4 in tree, + // "/sandbox//data/" + // subdir + "../../../../sandbox//src/", // up 4 in tree, + // "/sandbox//src/" + // subdir + "../../../../sandbox//inc/", // up 4 in tree, + // "/sandbox//inc/" + // subdir + "../../../../0_Simple//data/", // up 4 in tree, + // "/0_Simple//" + // subdir + "../../../../1_Utilities//data/", // up 4 in tree, + // "/1_Utilities//" + // subdir + "../../../../2_Graphics//data/", // up 4 in tree, + // "/2_Graphics//" + // subdir + "../../../../3_Imaging//data/", // up 4 in tree, + // "/3_Imaging//" + // subdir + "../../../../4_Finance//data/", // up 4 in tree, + // "/4_Finance//" + // subdir + "../../../../5_Simulations//data/", // up 4 in tree, + // "/5_Simulations//" + // subdir + "../../../../6_Advanced//data/", // up 4 in tree, + // "/6_Advanced//" + // subdir + "../../../../7_CUDALibraries//data/", // up 4 in tree, + // "/7_CUDALibraries//" + // subdir + "../../../../8_Android//data/", // up 4 in tree, + // "/8_Android//" + // subdir + "../../../../0_Simple//", // up 4 in tree, + // "/0_Simple//" + // subdir + "../../../../1_Utilities//", // up 4 in tree, + // "/1_Utilities//" + // subdir + "../../../../2_Graphics//", // up 4 in tree, + // "/2_Graphics//" + // subdir + "../../../../3_Imaging//", // up 4 in tree, + // "/3_Imaging//" + // subdir + "../../../../4_Finance//", // up 4 in tree, + // "/4_Finance//" + // subdir + "../../../../5_Simulations//", // up 4 in tree, + // "/5_Simulations//" + // subdir + "../../../../6_Advanced//", // up 4 in tree, + // "/6_Advanced//" + // subdir + "../../../../7_CUDALibraries//", // up 4 in tree, + // "/7_CUDALibraries//" + // subdir + "../../../../8_Android//", // up 4 in tree, + // "/8_Android//" + // subdir + "../../../../samples//data/", // up 4 in tree, + // "/samples//" + // subdir + "../../../../common/", // up 4 in tree, "../../../common/" subdir + "../../../../common/data/", // up 4 in tree, "../../../common/data/" + // subdir + "../../../../data/", // up 4 in tree, "../../../data/" subdir + "../../../../../", // up 5 in tree + "../../../../../src//", // up 5 in tree, + // "/src//" + // subdir + "../../../../../src//data/", // up 5 in tree, + // "/src//data/" + // subdir + "../../../../../src//src/", // up 5 in tree, + // "/src//src/" + // subdir + "../../../../../src//inc/", // up 5 in tree, + // "/src//inc/" + // subdir + "../../../../../sandbox//", // up 5 in tree, + // "/sandbox//" + // subdir + "../../../../../sandbox//data/", // up 5 in tree, + // "/sandbox//data/" + // subdir + "../../../../../sandbox//src/", // up 5 in tree, + // "/sandbox//src/" + // subdir + "../../../../../sandbox//inc/", // up 5 in tree, + // "/sandbox//inc/" + // subdir + "../../../../../0_Simple//data/", // up 5 in tree, + // "/0_Simple//" + // subdir + "../../../../../1_Utilities//data/", // up 5 in tree, + // "/1_Utilities//" + // subdir + "../../../../../2_Graphics//data/", // up 5 in tree, + // "/2_Graphics//" + // subdir + "../../../../../3_Imaging//data/", // up 5 in tree, + // "/3_Imaging//" + // subdir + "../../../../../4_Finance//data/", // up 5 in tree, + // "/4_Finance//" + // subdir + "../../../../../5_Simulations//data/", // up 5 in tree, + // "/5_Simulations//" + // subdir + "../../../../../6_Advanced//data/", // up 5 in tree, + // "/6_Advanced//" + // subdir + "../../../../../7_CUDALibraries//data/", // up 5 in + // tree, + // "/7_CUDALibraries//" + // subdir + "../../../../../8_Android//data/", // up 5 in tree, + // "/8_Android//" + // subdir + "../../../../../samples//data/", // up 5 in tree, + // "/samples//" + // subdir + "../../../../../common/", // up 5 in tree, "../../../common/" subdir + "../../../../../common/data/", // up 5 in tree, "../../../common/data/" + // subdir + }; + + // Extract the executable name + std::string executable_name; + + if (executable_path != 0) { + executable_name = std::string(executable_path); + +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) + // Windows path delimiter + size_t delimiter_pos = executable_name.find_last_of('\\'); + executable_name.erase(0, delimiter_pos + 1); + + if (executable_name.rfind(".exe") != std::string::npos) { + // we strip .exe, only if the .exe is found + executable_name.resize(executable_name.size() - 4); + } + +#else + // Linux & OSX path delimiter + size_t delimiter_pos = executable_name.find_last_of('/'); + executable_name.erase(0, delimiter_pos + 1); +#endif + } + + // Loop over all search paths and return the first hit + for (unsigned int i = 0; i < sizeof(searchPath) / sizeof(char *); ++i) { + std::string path(searchPath[i]); + size_t executable_name_pos = path.find(""); + + // If there is executable_name variable in the searchPath + // replace it with the value + if (executable_name_pos != std::string::npos) { + if (executable_path != 0) { + path.replace(executable_name_pos, strlen(""), + executable_name); + } else { + // Skip this path entry if no executable argument is given + continue; + } + } + +#ifdef _DEBUG + printf("sdkFindFilePath <%s> in %s\n", filename, path.c_str()); +#endif + + // Test if the file exists + path.append(filename); + FILE *fp; + FOPEN(fp, path.c_str(), "rb"); + + if (fp != NULL) { + fclose(fp); + // File found + // returning an allocated array here for backwards compatibility reasons + char *file_path = reinterpret_cast(malloc(path.length() + 1)); + STRCPY(file_path, path.length() + 1, path.c_str()); + return file_path; + } + + if (fp) { + fclose(fp); + } + } + + // File not found + return 0; +} + +#endif // COMMON_HELPER_STRING_H_ diff --git a/deviceQuery/readme.txt b/deviceQuery/readme.txt new file mode 100644 index 0000000..ab5aacc --- /dev/null +++ b/deviceQuery/readme.txt @@ -0,0 +1,8 @@ +Sample: deviceQuery +Minimum spec: SM 3.5 + +This sample enumerates the properties of the CUDA devices present in the system. + +Key concepts: +CUDA Runtime API +Device Query