diff --git a/python/src/main.cpp b/python/src/main.cpp index 43379efda3bf..b74fea33230a 100644 --- a/python/src/main.cpp +++ b/python/src/main.cpp @@ -193,6 +193,7 @@ PYBIND11_MODULE(ncnn, m) .def_readwrite("use_sgemm_convolution", &Option::use_sgemm_convolution) .def_readwrite("use_int8_inference", &Option::use_int8_inference) .def_readwrite("use_vulkan_compute", &Option::use_vulkan_compute) + .def_readwrite("use_bf16_packed", &Option::use_bf16_packed) .def_readwrite("use_bf16_storage", &Option::use_bf16_storage) .def_readwrite("use_fp16_packed", &Option::use_fp16_packed) .def_readwrite("use_fp16_storage", &Option::use_fp16_storage) diff --git a/python/tests/test_option.py b/python/tests/test_option.py index 278aeb8702df..19f2c1c8f872 100644 --- a/python/tests/test_option.py +++ b/python/tests/test_option.py @@ -52,6 +52,11 @@ def test_option(): opt.use_vulkan_compute = False assert opt.use_vulkan_compute == False + opt.use_bf16_packed = True + assert opt.use_bf16_packed == True + opt.use_bf16_packed = False + assert opt.use_bf16_packed == False + opt.use_bf16_storage = True assert opt.use_bf16_storage == True opt.use_bf16_storage = False diff --git a/src/c_api.cpp b/src/c_api.cpp index 65072eea2af8..3aaba7631a35 100644 --- a/src/c_api.cpp +++ b/src/c_api.cpp @@ -159,43 +159,193 @@ void ncnn_option_set_num_threads(ncnn_option_t opt, int num_threads) ((Option*)opt)->num_threads = num_threads; } +void ncnn_option_set_blob_allocator(ncnn_option_t opt, ncnn_allocator_t allocator) +{ + ((Option*)opt)->blob_allocator = allocator ? (Allocator*)allocator->pthis : NULL; +} + +void ncnn_option_set_workspace_allocator(ncnn_option_t opt, ncnn_allocator_t allocator) +{ + ((Option*)opt)->workspace_allocator = allocator ? (Allocator*)allocator->pthis : NULL; +} + +int ncnn_option_get_use_vulkan_compute(const ncnn_option_t opt) +{ +#if NCNN_VULKAN + return ((const Option*)opt)->use_vulkan_compute; +#else + (void)opt; + return 0; +#endif +} + int ncnn_option_get_use_local_pool_allocator(const ncnn_option_t opt) { - return ((Option*)opt)->use_local_pool_allocator; + return ((const Option*)opt)->use_local_pool_allocator; } -void ncnn_option_set_use_local_pool_allocator(ncnn_option_t opt, int use_local_pool_allocator) +int ncnn_option_get_use_winograd_convolution(const ncnn_option_t opt) { - ((Option*)opt)->use_local_pool_allocator = use_local_pool_allocator; + return ((const Option*)opt)->use_winograd_convolution; } -void ncnn_option_set_blob_allocator(ncnn_option_t opt, ncnn_allocator_t allocator) +int ncnn_option_get_use_sgemm_convolution(const ncnn_option_t opt) { - ((Option*)opt)->blob_allocator = allocator ? (Allocator*)allocator->pthis : NULL; + return ((const Option*)opt)->use_sgemm_convolution; } -void ncnn_option_set_workspace_allocator(ncnn_option_t opt, ncnn_allocator_t allocator) +int ncnn_option_get_use_packing_layout(const ncnn_option_t opt) { - ((Option*)opt)->workspace_allocator = allocator ? (Allocator*)allocator->pthis : NULL; + return ((const Option*)opt)->use_packing_layout; } -int ncnn_option_get_use_vulkan_compute(const ncnn_option_t opt) +int ncnn_option_get_use_fp16_packed(const ncnn_option_t opt) +{ + return ((const Option*)opt)->use_fp16_packed; +} + +int ncnn_option_get_use_fp16_storage(const ncnn_option_t opt) +{ + return ((const Option*)opt)->use_fp16_storage; +} + +int ncnn_option_get_use_fp16_arithmetic(const ncnn_option_t opt) +{ + return ((const Option*)opt)->use_fp16_arithmetic; +} + +int ncnn_option_get_use_int8_packed(const ncnn_option_t opt) +{ + return ((const Option*)opt)->use_int8_packed; +} + +int ncnn_option_get_use_int8_storage(const ncnn_option_t opt) +{ + return ((const Option*)opt)->use_int8_storage; +} + +int ncnn_option_get_use_int8_arithmetic(const ncnn_option_t opt) +{ + return ((const Option*)opt)->use_int8_arithmetic; +} + +int ncnn_option_get_use_bf16_packed(const ncnn_option_t opt) +{ + return ((const Option*)opt)->use_bf16_packed; +} + +int ncnn_option_get_use_bf16_storage(const ncnn_option_t opt) +{ + return ((const Option*)opt)->use_bf16_storage; +} + +int ncnn_option_get_use_shader_local_memory(const ncnn_option_t opt) { #if NCNN_VULKAN - return ((const Option*)opt)->use_vulkan_compute; + return ((const Option*)opt)->use_shader_local_memory; +#else + (void)opt; + return 0; +#endif +} + +int ncnn_option_get_use_cooperative_matrix(const ncnn_option_t opt) +{ +#if NCNN_VULKAN + return ((const Option*)opt)->use_cooperative_matrix; #else (void)opt; return 0; #endif } -void ncnn_option_set_use_vulkan_compute(ncnn_option_t opt, int use_vulkan_compute) +void ncnn_option_set_use_vulkan_compute(ncnn_option_t opt, int enable) { #if NCNN_VULKAN - ((Option*)opt)->use_vulkan_compute = use_vulkan_compute; + ((Option*)opt)->use_vulkan_compute = enable; #else (void)opt; - (void)use_vulkan_compute; + (void)enable; +#endif +} + +void ncnn_option_set_use_local_pool_allocator(ncnn_option_t opt, int enable) +{ + ((Option*)opt)->use_local_pool_allocator = enable; +} + +void ncnn_option_set_use_winograd_convolution(ncnn_option_t opt, int enable) +{ + ((Option*)opt)->use_winograd_convolution = enable; +} + +void ncnn_option_set_use_sgemm_convolution(ncnn_option_t opt, int enable) +{ + ((Option*)opt)->use_sgemm_convolution = enable; +} + +void ncnn_option_set_use_packing_layout(ncnn_option_t opt, int enable) +{ + ((Option*)opt)->use_packing_layout = enable; +} + +void ncnn_option_set_use_fp16_packed(ncnn_option_t opt, int enable) +{ + ((Option*)opt)->use_fp16_packed = enable; +} + +void ncnn_option_set_use_fp16_storage(ncnn_option_t opt, int enable) +{ + ((Option*)opt)->use_fp16_storage = enable; +} + +void ncnn_option_set_use_fp16_arithmetic(ncnn_option_t opt, int enable) +{ + ((Option*)opt)->use_fp16_arithmetic = enable; +} + +void ncnn_option_set_use_int8_packed(ncnn_option_t opt, int enable) +{ + ((Option*)opt)->use_int8_packed = enable; +} + +void ncnn_option_set_use_int8_storage(ncnn_option_t opt, int enable) +{ + ((Option*)opt)->use_int8_storage = enable; +} + +void ncnn_option_set_use_int8_arithmetic(ncnn_option_t opt, int enable) +{ + ((Option*)opt)->use_int8_arithmetic = enable; +} + +void ncnn_option_set_use_bf16_packed(ncnn_option_t opt, int enable) +{ + ((Option*)opt)->use_bf16_packed = enable; +} + +void ncnn_option_set_use_bf16_storage(ncnn_option_t opt, int enable) +{ + ((Option*)opt)->use_bf16_storage = enable; +} + +void ncnn_option_set_use_shader_local_memory(ncnn_option_t opt, int enable) +{ +#if NCNN_VULKAN + ((Option*)opt)->use_shader_local_memory = enable; +#else + (void)opt; + (void)enable; +#endif +} + +void ncnn_option_set_use_cooperative_matrix(ncnn_option_t opt, int enable) +{ +#if NCNN_VULKAN + ((Option*)opt)->use_cooperative_matrix = enable; +#else + (void)opt; + (void)enable; #endif } @@ -1105,7 +1255,12 @@ int ncnn_layer_get_support_inplace(const ncnn_layer_t layer) int ncnn_layer_get_support_vulkan(const ncnn_layer_t layer) { +#if NCNN_VULKAN return ((const Layer*)layer->pthis)->support_vulkan; +#else + (void)layer; + return 0; +#endif } int ncnn_layer_get_support_packing(const ncnn_layer_t layer) @@ -1125,7 +1280,12 @@ int ncnn_layer_get_support_fp16_storage(const ncnn_layer_t layer) int ncnn_layer_get_support_vulkan_packing(const ncnn_layer_t layer) { +#if NCNN_VULKAN return ((const Layer*)layer->pthis)->support_vulkan_packing; +#else + (void)layer; + return 0; +#endif } int ncnn_layer_get_support_any_packing(const ncnn_layer_t layer) @@ -1135,7 +1295,12 @@ int ncnn_layer_get_support_any_packing(const ncnn_layer_t layer) int ncnn_layer_get_support_vulkan_any_packing(const ncnn_layer_t layer) { +#if NCNN_VULKAN return ((const Layer*)layer->pthis)->support_vulkan_any_packing; +#else + (void)layer; + return 0; +#endif } void ncnn_layer_set_one_blob_only(ncnn_layer_t layer, int enable) @@ -1150,7 +1315,12 @@ void ncnn_layer_set_support_inplace(ncnn_layer_t layer, int enable) void ncnn_layer_set_support_vulkan(ncnn_layer_t layer, int enable) { +#if NCNN_VULKAN ((Layer*)layer->pthis)->support_vulkan = enable; +#else + (void)layer; + (void)enable; +#endif } void ncnn_layer_set_support_packing(ncnn_layer_t layer, int enable) @@ -1170,7 +1340,12 @@ void ncnn_layer_set_support_fp16_storage(ncnn_layer_t layer, int enable) void ncnn_layer_set_support_vulkan_packing(ncnn_layer_t layer, int enable) { +#if NCNN_VULKAN ((Layer*)layer->pthis)->support_vulkan_packing = enable; +#else + (void)layer; + (void)enable; +#endif } void ncnn_layer_set_support_any_packing(ncnn_layer_t layer, int enable) @@ -1180,7 +1355,12 @@ void ncnn_layer_set_support_any_packing(ncnn_layer_t layer, int enable) void ncnn_layer_set_support_vulkan_any_packing(ncnn_layer_t layer, int enable) { +#if NCNN_VULKAN ((Layer*)layer->pthis)->support_vulkan_any_packing = enable; +#else + (void)layer; + (void)enable; +#endif } int ncnn_layer_get_bottom_count(const ncnn_layer_t layer) diff --git a/src/c_api.h b/src/c_api.h index f07386d8be5b..a42994ca3fe9 100644 --- a/src/c_api.h +++ b/src/c_api.h @@ -41,14 +41,40 @@ NCNN_EXPORT void ncnn_option_destroy(ncnn_option_t opt); NCNN_EXPORT int ncnn_option_get_num_threads(const ncnn_option_t opt); NCNN_EXPORT void ncnn_option_set_num_threads(ncnn_option_t opt, int num_threads); -NCNN_EXPORT int ncnn_option_get_use_local_pool_allocator(const ncnn_option_t opt); -NCNN_EXPORT void ncnn_option_set_use_local_pool_allocator(ncnn_option_t opt, int use_local_pool_allocator); - NCNN_EXPORT void ncnn_option_set_blob_allocator(ncnn_option_t opt, ncnn_allocator_t allocator); NCNN_EXPORT void ncnn_option_set_workspace_allocator(ncnn_option_t opt, ncnn_allocator_t allocator); NCNN_EXPORT int ncnn_option_get_use_vulkan_compute(const ncnn_option_t opt); -NCNN_EXPORT void ncnn_option_set_use_vulkan_compute(ncnn_option_t opt, int use_vulkan_compute); +NCNN_EXPORT int ncnn_option_get_use_local_pool_allocator(const ncnn_option_t opt); +NCNN_EXPORT int ncnn_option_get_use_winograd_convolution(const ncnn_option_t opt); +NCNN_EXPORT int ncnn_option_get_use_sgemm_convolution(const ncnn_option_t opt); +NCNN_EXPORT int ncnn_option_get_use_packing_layout(const ncnn_option_t opt); +NCNN_EXPORT int ncnn_option_get_use_fp16_packed(const ncnn_option_t opt); +NCNN_EXPORT int ncnn_option_get_use_fp16_storage(const ncnn_option_t opt); +NCNN_EXPORT int ncnn_option_get_use_fp16_arithmetic(const ncnn_option_t opt); +NCNN_EXPORT int ncnn_option_get_use_int8_packed(const ncnn_option_t opt); +NCNN_EXPORT int ncnn_option_get_use_int8_storage(const ncnn_option_t opt); +NCNN_EXPORT int ncnn_option_get_use_int8_arithmetic(const ncnn_option_t opt); +NCNN_EXPORT int ncnn_option_get_use_bf16_packed(const ncnn_option_t opt); +NCNN_EXPORT int ncnn_option_get_use_bf16_storage(const ncnn_option_t opt); +NCNN_EXPORT int ncnn_option_get_use_shader_local_memory(const ncnn_option_t opt); +NCNN_EXPORT int ncnn_option_get_use_cooperative_matrix(const ncnn_option_t opt); + +NCNN_EXPORT void ncnn_option_set_use_vulkan_compute(ncnn_option_t opt, int enable); +NCNN_EXPORT void ncnn_option_set_use_local_pool_allocator(ncnn_option_t opt, int enable); +NCNN_EXPORT void ncnn_option_set_use_winograd_convolution(ncnn_option_t opt, int enable); +NCNN_EXPORT void ncnn_option_set_use_sgemm_convolution(ncnn_option_t opt, int enable); +NCNN_EXPORT void ncnn_option_set_use_packing_layout(ncnn_option_t opt, int enable); +NCNN_EXPORT void ncnn_option_set_use_fp16_packed(ncnn_option_t opt, int enable); +NCNN_EXPORT void ncnn_option_set_use_fp16_storage(ncnn_option_t opt, int enable); +NCNN_EXPORT void ncnn_option_set_use_fp16_arithmetic(ncnn_option_t opt, int enable); +NCNN_EXPORT void ncnn_option_set_use_int8_packed(ncnn_option_t opt, int enable); +NCNN_EXPORT void ncnn_option_set_use_int8_storage(ncnn_option_t opt, int enable); +NCNN_EXPORT void ncnn_option_set_use_int8_arithmetic(ncnn_option_t opt, int enable); +NCNN_EXPORT void ncnn_option_set_use_bf16_packed(ncnn_option_t opt, int enable); +NCNN_EXPORT void ncnn_option_set_use_bf16_storage(ncnn_option_t opt, int enable); +NCNN_EXPORT void ncnn_option_set_use_shader_local_memory(ncnn_option_t opt, int enable); +NCNN_EXPORT void ncnn_option_set_use_cooperative_matrix(ncnn_option_t opt, int enable); /* mat api */ typedef struct __ncnn_mat_t* ncnn_mat_t; diff --git a/tests/test_c_api.cpp b/tests/test_c_api.cpp index a92174674b2f..643ed15e3d28 100644 --- a/tests/test_c_api.cpp +++ b/tests/test_c_api.cpp @@ -329,7 +329,79 @@ static int test_c_api_2() return success ? 0 : -1; } +static int test_c_api_3() +{ + // test option setter getter + ncnn_option_t opt = ncnn_option_create(); + +#define TEST_OPTION_SET_GET(name, V0, V1) \ + { \ + ncnn_option_set_##name(opt, V0); \ + int _s0 = ncnn_option_get_##name(opt); \ + if (_s0 != V0) return -1; \ + ncnn_option_set_##name(opt, V1); \ + int _s1 = ncnn_option_get_##name(opt); \ + if (_s1 != V1) return -1; \ + } + + TEST_OPTION_SET_GET(num_threads, 4, 1) + TEST_OPTION_SET_GET(use_local_pool_allocator, 1, 0) + TEST_OPTION_SET_GET(use_winograd_convolution, 1, 0) + TEST_OPTION_SET_GET(use_sgemm_convolution, 1, 0) + TEST_OPTION_SET_GET(use_packing_layout, 1, 0) + TEST_OPTION_SET_GET(use_fp16_packed, 1, 0) + TEST_OPTION_SET_GET(use_fp16_storage, 1, 0) + TEST_OPTION_SET_GET(use_fp16_arithmetic, 1, 0) + TEST_OPTION_SET_GET(use_int8_packed, 1, 0) + TEST_OPTION_SET_GET(use_int8_storage, 1, 0) + TEST_OPTION_SET_GET(use_int8_arithmetic, 1, 0) + TEST_OPTION_SET_GET(use_bf16_packed, 1, 0) + TEST_OPTION_SET_GET(use_bf16_storage, 1, 0) + +#if NCNN_VULKAN + TEST_OPTION_SET_GET(use_vulkan_compute, 1, 0) + TEST_OPTION_SET_GET(use_shader_local_memory, 1, 0) + TEST_OPTION_SET_GET(use_cooperative_matrix, 1, 0) +#endif + +#undef TEST_OPTION_SET_GET + + ncnn_option_destroy(opt); + + // test layer setter getter + ncnn_layer_t layer = ncnn_layer_create(); + +#define TEST_LAYER_SET_GET(name, V0, V1) \ + { \ + ncnn_layer_set_##name(layer, V0); \ + int _s0 = ncnn_layer_get_##name(layer); \ + if (_s0 != V0) return -1; \ + ncnn_layer_set_##name(layer, V1); \ + int _s1 = ncnn_layer_get_##name(layer); \ + if (_s1 != V1) return -1; \ + } + + TEST_LAYER_SET_GET(one_blob_only, 1, 0) + TEST_LAYER_SET_GET(support_inplace, 1, 0) + TEST_LAYER_SET_GET(support_packing, 1, 0) + TEST_LAYER_SET_GET(support_bf16_storage, 1, 0) + TEST_LAYER_SET_GET(support_fp16_storage, 1, 0) + TEST_LAYER_SET_GET(support_any_packing, 1, 0) + +#if NCNN_VULKAN + TEST_LAYER_SET_GET(support_vulkan, 1, 0) + TEST_LAYER_SET_GET(support_vulkan_packing, 1, 0) + TEST_LAYER_SET_GET(support_vulkan_any_packing, 1, 0) +#endif + +#undef TEST_LAYER_SET_GET + + ncnn_layer_destroy(layer); + + return 0; +} + int main() { - return test_c_api_0() || test_c_api_1() || test_c_api_2(); + return test_c_api_0() || test_c_api_1() || test_c_api_2() || test_c_api_3(); }