|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once |
|
|
|
#include "logger.h" |
|
|
|
#include <cuda_runtime.h> |
|
#include <fstream> |
|
#include <iostream> |
|
#include <string> |
|
#include <vector> |
|
|
|
namespace fastertransformer { |
|
|
|
template<typename T> |
|
void check(T result, char const* const func, const char* const file, int const line) |
|
{ |
|
if (result) { |
|
throw std::runtime_error(std::string("[FT][ERROR] CUDA runtime error: ") + ("<unknown>") + " " |
|
+ file + ":" + std::to_string(line) + " \n"); |
|
} |
|
} |
|
|
|
#define check_cuda_error(val) check((val), #val, __FILE__, __LINE__) |
|
|
|
[[noreturn]] inline void throwRuntimeError(const char* const file, int const line, std::string const& info = "") |
|
{ |
|
throw std::runtime_error(std::string("[FT][ERROR] ") + info + " Assertion fail: " + file + ":" |
|
+ std::to_string(line) + " \n"); |
|
} |
|
|
|
inline void myAssert(bool result, const char* const file, int const line, std::string const& info = "") |
|
{ |
|
if (!result) { |
|
throwRuntimeError(file, line, info); |
|
} |
|
} |
|
|
|
#define FT_CHECK(val) myAssert(val, __FILE__, __LINE__) |
|
#define FT_CHECK_WITH_INFO(val, info) \ |
|
do { \ |
|
bool is_valid_val = (val); \ |
|
if (!is_valid_val) { \ |
|
fastertransformer::myAssert(is_valid_val, __FILE__, __LINE__, (info)); \ |
|
} \ |
|
} while (0) |
|
|
|
|
|
inline int getSMVersion() |
|
{ |
|
int device{-1}; |
|
check_cuda_error(cudaGetDevice(&device)); |
|
int sm_major = 0; |
|
int sm_minor = 0; |
|
check_cuda_error(cudaDeviceGetAttribute(&sm_major, cudaDevAttrComputeCapabilityMajor, device)); |
|
check_cuda_error(cudaDeviceGetAttribute(&sm_minor, cudaDevAttrComputeCapabilityMinor, device)); |
|
return sm_major * 10 + sm_minor; |
|
} |
|
|
|
cudaError_t getSetDevice(int i_device, int* o_device = NULL); |
|
|
|
} |
|
|