mirror of
https://github.com/hashcat/hashcat.git
synced 2024-11-29 03:18:30 +00:00
Add nvrtc wrapper for later use
This commit is contained in:
parent
4b986de5fb
commit
4045e60021
@ -4,6 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _INC_PLATFORM_H
|
#ifndef _INC_PLATFORM_H
|
||||||
|
#define _INC_PLATFORM_H
|
||||||
|
|
||||||
#ifdef IS_CUDA
|
#ifdef IS_CUDA
|
||||||
DECLSPEC u32 atomic_dec (u32 *p);
|
DECLSPEC u32 atomic_dec (u32 *p);
|
||||||
@ -11,11 +12,6 @@ DECLSPEC u32 atomic_inc (u32 *p);
|
|||||||
DECLSPEC size_t get_global_id (const u32 dimindx __attribute__((unused)));
|
DECLSPEC size_t get_global_id (const u32 dimindx __attribute__((unused)));
|
||||||
DECLSPEC size_t get_local_id (const u32 dimindx __attribute__((unused)));
|
DECLSPEC size_t get_local_id (const u32 dimindx __attribute__((unused)));
|
||||||
DECLSPEC size_t get_local_size (const u32 dimindx __attribute__((unused)));
|
DECLSPEC size_t get_local_size (const u32 dimindx __attribute__((unused)));
|
||||||
DECLSPEC uint4 uint4_init (const u32 a);
|
|
||||||
DECLSPEC uint4 uint4_init (const u32 a, const u32 b, const u32 c, const u32 d);
|
|
||||||
DECLSPEC __inline__ u8 rotate (const u8 v, const int i);
|
|
||||||
DECLSPEC __inline__ u32 rotate (const u32 v, const int i);
|
|
||||||
DECLSPEC __inline__ u64 rotate (const u64 v, const int i);
|
|
||||||
|
|
||||||
#define rotate(a,n) (((a) << (n)) | ((a) >> (32 - (n))))
|
#define rotate(a,n) (((a) << (n)) | ((a) >> (32 - (n))))
|
||||||
#define bitselect(a,b,c) ((a) ^ ((c) & ((b) ^ (a))))
|
#define bitselect(a,b,c) ((a) ^ ((c) & ((b) ^ (a))))
|
||||||
|
@ -73,6 +73,7 @@
|
|||||||
- Kernel Compile: Removed -cl-std= from all kernel build options since we're compatible to all OpenCL versions
|
- Kernel Compile: Removed -cl-std= from all kernel build options since we're compatible to all OpenCL versions
|
||||||
- Mode 16800/16801 hash format: Changed separator character from '*' to ':'
|
- Mode 16800/16801 hash format: Changed separator character from '*' to ':'
|
||||||
- Requirements: Update runtime check for minimum NVIDIA driver version from 367.x to 418.56 or later
|
- Requirements: Update runtime check for minimum NVIDIA driver version from 367.x to 418.56 or later
|
||||||
|
- Requirements: Add new requirement for NVIDIA GPU: CUDA Toolkit (10.1 or later)
|
||||||
|
|
||||||
* changes v5.0.0 -> v5.1.0
|
* changes v5.0.0 -> v5.1.0
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ AMD GPUs on Windows require "AMD Radeon Software Crimson Edition" (15.12 or late
|
|||||||
Intel CPUs require "OpenCL Runtime for Intel Core and Intel Xeon Processors" (16.1.1 or later)
|
Intel CPUs require "OpenCL Runtime for Intel Core and Intel Xeon Processors" (16.1.1 or later)
|
||||||
Intel GPUs on Linux require "OpenCL 2.0 GPU Driver Package for Linux" (2.0 or later)
|
Intel GPUs on Linux require "OpenCL 2.0 GPU Driver Package for Linux" (2.0 or later)
|
||||||
Intel GPUs on Windows require "OpenCL Driver for Intel Iris and Intel HD Graphics"
|
Intel GPUs on Windows require "OpenCL Driver for Intel Iris and Intel HD Graphics"
|
||||||
NVIDIA GPUs require "NVIDIA Driver" (418.56 or later)
|
NVIDIA GPUs require "NVIDIA Driver" (418.56 or later) and "CUDA Toolkit" (10.1 or later)
|
||||||
|
|
||||||
##
|
##
|
||||||
## Features
|
## Features
|
||||||
|
81
include/ext_nvrtc.h
Normal file
81
include/ext_nvrtc.h
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
/**
|
||||||
|
* Author......: See docs/credits.txt
|
||||||
|
* License.....: MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _EXT_NVRTC_H
|
||||||
|
#define _EXT_NVRTC_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* from cuda.h (/usr/local/cuda-10.1/targets/x86_64-linux/include/nvrtc.h)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup error
|
||||||
|
* \brief The enumerated type nvrtcResult defines API call result codes.
|
||||||
|
* NVRTC API functions return nvrtcResult to indicate the call
|
||||||
|
* result.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
NVRTC_SUCCESS = 0,
|
||||||
|
NVRTC_ERROR_OUT_OF_MEMORY = 1,
|
||||||
|
NVRTC_ERROR_PROGRAM_CREATION_FAILURE = 2,
|
||||||
|
NVRTC_ERROR_INVALID_INPUT = 3,
|
||||||
|
NVRTC_ERROR_INVALID_PROGRAM = 4,
|
||||||
|
NVRTC_ERROR_INVALID_OPTION = 5,
|
||||||
|
NVRTC_ERROR_COMPILATION = 6,
|
||||||
|
NVRTC_ERROR_BUILTIN_OPERATION_FAILURE = 7,
|
||||||
|
NVRTC_ERROR_NO_NAME_EXPRESSIONS_AFTER_COMPILATION = 8,
|
||||||
|
NVRTC_ERROR_NO_LOWERED_NAMES_BEFORE_COMPILATION = 9,
|
||||||
|
NVRTC_ERROR_NAME_EXPRESSION_NOT_VALID = 10,
|
||||||
|
NVRTC_ERROR_INTERNAL_ERROR = 11
|
||||||
|
} nvrtcResult;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup compilation
|
||||||
|
* \brief nvrtcProgram is the unit of compilation, and an opaque handle for
|
||||||
|
* a program.
|
||||||
|
*
|
||||||
|
* To compile a CUDA program string, an instance of nvrtcProgram must be
|
||||||
|
* created first with ::nvrtcCreateProgram, then compiled with
|
||||||
|
* ::nvrtcCompileProgram.
|
||||||
|
*/
|
||||||
|
typedef struct _nvrtcProgram *nvrtcProgram;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define NVRTCAPI __stdcall
|
||||||
|
#else
|
||||||
|
#define NVRTCAPI
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define NVRTC_API_CALL NVRTCAPI
|
||||||
|
|
||||||
|
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCADDNAMEEXPRESSION) (nvrtcProgram, const char *);
|
||||||
|
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCCOMPILEPROGRAM) (nvrtcProgram, int, const char **);
|
||||||
|
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCCREATEPROGRAM) (nvrtcProgram *, const char *, const char *, int, const char **, const char **);
|
||||||
|
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCDESTROYPROGRAM) (nvrtcProgram *);
|
||||||
|
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCGETLOWEREDNAME) (nvrtcProgram, const char *, const char **);
|
||||||
|
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCGETPTX) (nvrtcProgram, char *);
|
||||||
|
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCGETPTXSIZE) (nvrtcProgram, size_t *);
|
||||||
|
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCGETPROGRAMLOG) (nvrtcProgram, char *);
|
||||||
|
typedef nvrtcResult (NVRTC_API_CALL *NVRTC_NVRTCGETPROGRAMLOGSIZE) (nvrtcProgram, size_t *);
|
||||||
|
|
||||||
|
typedef struct hc_nvrtc_lib
|
||||||
|
{
|
||||||
|
hc_dynlib_t lib;
|
||||||
|
|
||||||
|
NVRTC_NVRTCADDNAMEEXPRESSION nvrtcAddNameExpression;
|
||||||
|
NVRTC_NVRTCCOMPILEPROGRAM nvrtcCompileProgram;
|
||||||
|
NVRTC_NVRTCCREATEPROGRAM nvrtcCreateProgram;
|
||||||
|
NVRTC_NVRTCDESTROYPROGRAM nvrtcDestroyProgram;
|
||||||
|
NVRTC_NVRTCGETLOWEREDNAME nvrtcGetLoweredName;
|
||||||
|
NVRTC_NVRTCGETPTX nvrtcGetPTX;
|
||||||
|
NVRTC_NVRTCGETPTXSIZE nvrtcGetPTXSize;
|
||||||
|
NVRTC_NVRTCGETPROGRAMLOG nvrtcGetProgramLog;
|
||||||
|
NVRTC_NVRTCGETPROGRAMLOGSIZE nvrtcGetProgramLogSize;
|
||||||
|
|
||||||
|
} hc_nvrtc_lib_t;
|
||||||
|
|
||||||
|
typedef hc_nvrtc_lib_t NVRTC_PTR;
|
||||||
|
|
||||||
|
#endif // _EXT_NVRTC_H
|
@ -989,6 +989,7 @@ typedef struct link_speed
|
|||||||
|
|
||||||
} link_speed_t;
|
} link_speed_t;
|
||||||
|
|
||||||
|
#include "ext_nvrtc.h"
|
||||||
#include "ext_cuda.h"
|
#include "ext_cuda.h"
|
||||||
#include "ext_OpenCL.h"
|
#include "ext_OpenCL.h"
|
||||||
|
|
||||||
@ -1335,6 +1336,7 @@ typedef struct backend_ctx
|
|||||||
|
|
||||||
void *ocl;
|
void *ocl;
|
||||||
void *cuda;
|
void *cuda;
|
||||||
|
void *nvrtc;
|
||||||
|
|
||||||
cl_uint platforms_cnt;
|
cl_uint platforms_cnt;
|
||||||
cl_platform_id *platforms;
|
cl_platform_id *platforms;
|
||||||
|
@ -280,7 +280,7 @@ EMU_OBJS_ALL += emu_inc_truecrypt_crc32 emu_inc_truecrypt_keyfile emu
|
|||||||
EMU_OBJS_ALL += emu_inc_hash_md4 emu_inc_hash_md5 emu_inc_hash_ripemd160 emu_inc_hash_sha1 emu_inc_hash_sha256 emu_inc_hash_sha384 emu_inc_hash_sha512 emu_inc_hash_streebog256 emu_inc_hash_streebog512
|
EMU_OBJS_ALL += emu_inc_hash_md4 emu_inc_hash_md5 emu_inc_hash_ripemd160 emu_inc_hash_sha1 emu_inc_hash_sha256 emu_inc_hash_sha384 emu_inc_hash_sha512 emu_inc_hash_streebog256 emu_inc_hash_streebog512
|
||||||
EMU_OBJS_ALL += emu_inc_cipher_aes emu_inc_cipher_camellia emu_inc_cipher_des emu_inc_cipher_kuznyechik emu_inc_cipher_serpent emu_inc_cipher_twofish
|
EMU_OBJS_ALL += emu_inc_cipher_aes emu_inc_cipher_camellia emu_inc_cipher_des emu_inc_cipher_kuznyechik emu_inc_cipher_serpent emu_inc_cipher_twofish
|
||||||
|
|
||||||
OBJS_ALL := affinity autotune backend benchmark bitmap bitops combinator common convert cpt cpu_crc32 debugfile dictstat dispatch dynloader event ext_ADL ext_cuda ext_nvapi ext_nvml ext_OpenCL ext_sysfs ext_lzma filehandling folder hashcat hashes hlfmt hwmon induct interface keyboard_layout locking logfile loopback memory monitor mpsp outfile_check outfile pidfile potfile restore rp rp_cpu selftest slow_candidates shared status stdout straight terminal thread timer tuningdb usage user_options wordlist $(EMU_OBJS_ALL)
|
OBJS_ALL := affinity autotune backend benchmark bitmap bitops combinator common convert cpt cpu_crc32 debugfile dictstat dispatch dynloader event ext_ADL ext_cuda ext_nvapi ext_nvml ext_nvrtc ext_OpenCL ext_sysfs ext_lzma filehandling folder hashcat hashes hlfmt hwmon induct interface keyboard_layout locking logfile loopback memory monitor mpsp outfile_check outfile pidfile potfile restore rp rp_cpu selftest slow_candidates shared status stdout straight terminal thread timer tuningdb usage user_options wordlist $(EMU_OBJS_ALL)
|
||||||
|
|
||||||
ifeq ($(ENABLE_BRAIN),1)
|
ifeq ($(ENABLE_BRAIN),1)
|
||||||
OBJS_ALL += brain
|
OBJS_ALL += brain
|
||||||
|
@ -543,6 +543,73 @@ void generate_cached_kernel_amp_filename (const u32 attack_kern, char *profile_d
|
|||||||
snprintf (cached_file, 255, "%s/kernels/amp_a%u.%s.kernel", profile_dir, attack_kern, device_name_chksum_amp_mp);
|
snprintf (cached_file, 255, "%s/kernels/amp_a%u.%s.kernel", profile_dir, attack_kern, device_name_chksum_amp_mp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nvrtc_init (hashcat_ctx_t *hashcat_ctx)
|
||||||
|
{
|
||||||
|
backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx;
|
||||||
|
|
||||||
|
NVRTC_PTR *nvrtc = backend_ctx->nvrtc;
|
||||||
|
|
||||||
|
memset (nvrtc, 0, sizeof (NVRTC_PTR));
|
||||||
|
|
||||||
|
#if defined (_WIN)
|
||||||
|
nvrtc->lib = hc_dlopen ("nvrtc");
|
||||||
|
#elif defined (__APPLE__)
|
||||||
|
nvrtc->lib = hc_dlopen ("/System/Library/Frameworks/NVRTC.framework/NVRTC");
|
||||||
|
#elif defined (__CYGWIN__)
|
||||||
|
nvrtc->lib = hc_dlopen ("nvrtc.dll");
|
||||||
|
|
||||||
|
if (nvrtc->lib == NULL) nvrtc->lib = hc_dlopen ("cygnvrtc-1.dll");
|
||||||
|
#else
|
||||||
|
nvrtc->lib = hc_dlopen ("libnvrtc.so");
|
||||||
|
|
||||||
|
if (nvrtc->lib == NULL) nvrtc->lib = hc_dlopen ("libnvrtc.so.1");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (nvrtc->lib == NULL)
|
||||||
|
{
|
||||||
|
event_log_error (hashcat_ctx, "Cannot find NVRTC library.");
|
||||||
|
|
||||||
|
event_log_warning (hashcat_ctx, "You are probably missing the native CUDA SDK and/or driver for your platform.");
|
||||||
|
event_log_warning (hashcat_ctx, "NVIDIA GPUs require this runtime and/or driver:");
|
||||||
|
event_log_warning (hashcat_ctx, " \"NVIDIA Driver\" (418.56 or later)");
|
||||||
|
event_log_warning (hashcat_ctx, " \"CUDA Toolkit\" (10.1 or later)");
|
||||||
|
event_log_warning (hashcat_ctx, NULL);
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
HC_LOAD_FUNC (nvrtc, nvrtcAddNameExpression, NVRTC_NVRTCADDNAMEEXPRESSION, NVRTC, 1);
|
||||||
|
HC_LOAD_FUNC (nvrtc, nvrtcCompileProgram, NVRTC_NVRTCCOMPILEPROGRAM, NVRTC, 1);
|
||||||
|
HC_LOAD_FUNC (nvrtc, nvrtcCreateProgram, NVRTC_NVRTCCREATEPROGRAM, NVRTC, 1);
|
||||||
|
HC_LOAD_FUNC (nvrtc, nvrtcDestroyProgram, NVRTC_NVRTCDESTROYPROGRAM, NVRTC, 1);
|
||||||
|
HC_LOAD_FUNC (nvrtc, nvrtcGetLoweredName, NVRTC_NVRTCGETLOWEREDNAME, NVRTC, 1);
|
||||||
|
HC_LOAD_FUNC (nvrtc, nvrtcGetPTX, NVRTC_NVRTCGETPTX, NVRTC, 1);
|
||||||
|
HC_LOAD_FUNC (nvrtc, nvrtcGetPTXSize, NVRTC_NVRTCGETPTXSIZE, NVRTC, 1);
|
||||||
|
HC_LOAD_FUNC (nvrtc, nvrtcGetProgramLog, NVRTC_NVRTCGETPROGRAMLOG, NVRTC, 1);
|
||||||
|
HC_LOAD_FUNC (nvrtc, nvrtcGetProgramLogSize, NVRTC_NVRTCGETPROGRAMLOGSIZE, NVRTC, 1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nvrtc_close (hashcat_ctx_t *hashcat_ctx)
|
||||||
|
{
|
||||||
|
backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx;
|
||||||
|
|
||||||
|
NVRTC_PTR *nvrtc = backend_ctx->nvrtc;
|
||||||
|
|
||||||
|
if (nvrtc)
|
||||||
|
{
|
||||||
|
if (nvrtc->lib)
|
||||||
|
{
|
||||||
|
hc_dlclose (nvrtc->lib);
|
||||||
|
}
|
||||||
|
|
||||||
|
hcfree (backend_ctx->nvrtc);
|
||||||
|
|
||||||
|
backend_ctx->nvrtc = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int cuda_init (hashcat_ctx_t *hashcat_ctx)
|
int cuda_init (hashcat_ctx_t *hashcat_ctx)
|
||||||
{
|
{
|
||||||
backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx;
|
backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx;
|
||||||
@ -572,6 +639,7 @@ int cuda_init (hashcat_ctx_t *hashcat_ctx)
|
|||||||
event_log_warning (hashcat_ctx, "You are probably missing the native CUDA runtime or driver for your platform.");
|
event_log_warning (hashcat_ctx, "You are probably missing the native CUDA runtime or driver for your platform.");
|
||||||
event_log_warning (hashcat_ctx, "NVIDIA GPUs require this runtime and/or driver:");
|
event_log_warning (hashcat_ctx, "NVIDIA GPUs require this runtime and/or driver:");
|
||||||
event_log_warning (hashcat_ctx, " \"NVIDIA Driver\" (418.56 or later)");
|
event_log_warning (hashcat_ctx, " \"NVIDIA Driver\" (418.56 or later)");
|
||||||
|
event_log_warning (hashcat_ctx, " \"CUDA Toolkit\" (10.1 or later)");
|
||||||
event_log_warning (hashcat_ctx, NULL);
|
event_log_warning (hashcat_ctx, NULL);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
@ -702,6 +770,7 @@ int ocl_init (hashcat_ctx_t *hashcat_ctx)
|
|||||||
|
|
||||||
event_log_warning (hashcat_ctx, "* NVIDIA GPUs require this runtime and/or driver:");
|
event_log_warning (hashcat_ctx, "* NVIDIA GPUs require this runtime and/or driver:");
|
||||||
event_log_warning (hashcat_ctx, " \"NVIDIA Driver\" (418.56 or later)");
|
event_log_warning (hashcat_ctx, " \"NVIDIA Driver\" (418.56 or later)");
|
||||||
|
event_log_warning (hashcat_ctx, " \"CUDA Toolkit\" (10.1 or later)");
|
||||||
event_log_warning (hashcat_ctx, NULL);
|
event_log_warning (hashcat_ctx, NULL);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
@ -3071,6 +3140,31 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx)
|
|||||||
cuda_close (hashcat_ctx);
|
cuda_close (hashcat_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load and map NVRTC library calls
|
||||||
|
*/
|
||||||
|
|
||||||
|
NVRTC_PTR *nvrtc = (NVRTC_PTR *) hcmalloc (sizeof (NVRTC_PTR));
|
||||||
|
|
||||||
|
backend_ctx->nvrtc = nvrtc;
|
||||||
|
|
||||||
|
const int rc_nvrtc_init = nvrtc_init (hashcat_ctx);
|
||||||
|
|
||||||
|
if (rc_nvrtc_init == -1)
|
||||||
|
{
|
||||||
|
nvrtc_close (hashcat_ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if both CUDA and NVRTC were load successful
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ((rc_cuda_init == -1) || (rc_nvrtc_init == -1))
|
||||||
|
{
|
||||||
|
cuda_close (hashcat_ctx);
|
||||||
|
nvrtc_close (hashcat_ctx);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load and map OpenCL library calls
|
* Load and map OpenCL library calls
|
||||||
*/
|
*/
|
||||||
@ -3086,6 +3180,7 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx)
|
|||||||
ocl_close (hashcat_ctx);
|
ocl_close (hashcat_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return if both CUDA and OpenCL initialization failed
|
* return if both CUDA and OpenCL initialization failed
|
||||||
*/
|
*/
|
||||||
@ -3199,6 +3294,7 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx)
|
|||||||
|
|
||||||
event_log_warning (hashcat_ctx, "* NVIDIA GPUs require this runtime and/or driver:");
|
event_log_warning (hashcat_ctx, "* NVIDIA GPUs require this runtime and/or driver:");
|
||||||
event_log_warning (hashcat_ctx, " \"NVIDIA Driver\" (418.56 or later)");
|
event_log_warning (hashcat_ctx, " \"NVIDIA Driver\" (418.56 or later)");
|
||||||
|
event_log_warning (hashcat_ctx, " \"CUDA Toolkit\" (10.1 or later)");
|
||||||
event_log_warning (hashcat_ctx, NULL);
|
event_log_warning (hashcat_ctx, NULL);
|
||||||
|
|
||||||
FREE_OPENCL_CTX_ON_ERROR;
|
FREE_OPENCL_CTX_ON_ERROR;
|
||||||
@ -3300,6 +3396,7 @@ void backend_ctx_destroy (hashcat_ctx_t *hashcat_ctx)
|
|||||||
|
|
||||||
if (backend_ctx->enabled == false) return;
|
if (backend_ctx->enabled == false) return;
|
||||||
|
|
||||||
|
cuda_close (hashcat_ctx);
|
||||||
ocl_close (hashcat_ctx);
|
ocl_close (hashcat_ctx);
|
||||||
|
|
||||||
hcfree (backend_ctx->devices_param);
|
hcfree (backend_ctx->devices_param);
|
||||||
|
8
src/ext_nvrtc.c
Normal file
8
src/ext_nvrtc.c
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* Author......: See docs/credits.txt
|
||||||
|
* License.....: MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "types.h"
|
||||||
|
#include "ext_nvrtc.h"
|
Loading…
Reference in New Issue
Block a user