Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions c/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ set_target_properties(
POSITION_INDEPENDENT_CODE ON
INTERFACE_POSITION_INDEPENDENT_CODE ON
EXPORT_NAME c_api
CXX_VISIBILITY_PRESET hidden
VISIBILITY_INLINES_HIDDEN ON
)

# Setup the VERSION and SOVERSION of our library
Expand Down
12 changes: 7 additions & 5 deletions c/include/cuvs/cluster/kmeans.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
#include <dlpack/dlpack.h>
#include <stdint.h>

#include <cuvs/core/export.h>

#ifdef __cplusplus
extern "C" {
#endif
Expand Down Expand Up @@ -119,15 +121,15 @@ typedef struct cuvsKMeansParams* cuvsKMeansParams_t;
* @param[in] params cuvsKMeansParams_t to allocate
* @return cuvsError_t
*/
cuvsError_t cuvsKMeansParamsCreate(cuvsKMeansParams_t* params);
CUVS_EXPORT cuvsError_t cuvsKMeansParamsCreate(cuvsKMeansParams_t* params);

/**
* @brief De-allocate KMeans params
*
* @param[in] params
* @return cuvsError_t
*/
cuvsError_t cuvsKMeansParamsDestroy(cuvsKMeansParams_t params);
CUVS_EXPORT cuvsError_t cuvsKMeansParamsDestroy(cuvsKMeansParams_t params);

/**
* @brief Type of k-means algorithm.
Expand Down Expand Up @@ -173,7 +175,7 @@ typedef enum { CUVS_KMEANS_TYPE_KMEANS = 0, CUVS_KMEANS_TYPE_KMEANS_BALANCED = 1
* closest cluster center.
* @param[out] n_iter Number of iterations run.
*/
cuvsError_t cuvsKMeansFit(cuvsResources_t res,
CUVS_EXPORT cuvsError_t cuvsKMeansFit(cuvsResources_t res,
cuvsKMeansParams_t params,
DLManagedTensor* X,
DLManagedTensor* sample_weight,
Expand All @@ -200,7 +202,7 @@ cuvsError_t cuvsKMeansFit(cuvsResources_t res,
* @param[out] inertia Sum of squared distances of samples to
* their closest cluster center.
*/
cuvsError_t cuvsKMeansPredict(cuvsResources_t res,
CUVS_EXPORT cuvsError_t cuvsKMeansPredict(cuvsResources_t res,
cuvsKMeansParams_t params,
DLManagedTensor* X,
DLManagedTensor* sample_weight,
Expand All @@ -222,7 +224,7 @@ cuvsError_t cuvsKMeansPredict(cuvsResources_t res,
* @param[out] cost Resulting cluster cost
*
*/
cuvsError_t cuvsKMeansClusterCost(cuvsResources_t res,
CUVS_EXPORT cuvsError_t cuvsKMeansClusterCost(cuvsResources_t res,
DLManagedTensor* X,
DLManagedTensor* centroids,
double* cost);
Expand Down
1 change: 1 addition & 0 deletions c/include/cuvs/core/all.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#pragma once

#include <cuvs/core/c_config.h>
#include <cuvs/core/export.h>
#include <cuvs/core/c_api.h>

#include <cuvs/cluster/kmeans.h>
Expand Down
50 changes: 26 additions & 24 deletions c/include/cuvs/core/c_api.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION.
* SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION.
* SPDX-License-Identifier: Apache-2.0
*/

Expand All @@ -10,6 +10,8 @@
#include <stdbool.h>
#include <stdint.h>

#include <cuvs/core/export.h>

#ifdef __cplusplus
extern "C" {
#endif
Expand All @@ -27,13 +29,13 @@ typedef enum { CUVS_ERROR = 0, CUVS_SUCCESS = 1 } cuvsError_t;
/** @brief Returns a string describing the last seen error on this thread, or
* NULL if the last function succeeded.
*/
const char* cuvsGetLastErrorText();
CUVS_EXPORT const char* cuvsGetLastErrorText();

/**
* @brief Sets a string describing an error seen on the thread. Passing NULL
* clears any previously seen error message.
*/
void cuvsSetLastErrorText(const char* error);
CUVS_EXPORT void cuvsSetLastErrorText(const char* error);

/** @} */

Expand All @@ -58,11 +60,11 @@ typedef enum {

/** @brief Returns the current log level
*/
cuvsLogLevel_t cuvsGetLogLevel();
CUVS_EXPORT cuvsLogLevel_t cuvsGetLogLevel();

/** @brief Sets the log level
*/
void cuvsSetLogLevel(cuvsLogLevel_t);
CUVS_EXPORT void cuvsSetLogLevel(cuvsLogLevel_t);

/** @} */

Expand All @@ -83,15 +85,15 @@ typedef uintptr_t cuvsResources_t;
* @param[in] res cuvsResources_t opaque C handle
* @return cuvsError_t
*/
cuvsError_t cuvsResourcesCreate(cuvsResources_t* res);
CUVS_EXPORT cuvsError_t cuvsResourcesCreate(cuvsResources_t* res);

/**
* @brief Destroy and de-allocate opaque C handle for C++ type `raft::resources`
*
* @param[in] res cuvsResources_t opaque C handle
* @return cuvsError_t
*/
cuvsError_t cuvsResourcesDestroy(cuvsResources_t res);
CUVS_EXPORT cuvsError_t cuvsResourcesDestroy(cuvsResources_t res);

/**
* @brief Set cudaStream_t on cuvsResources_t to queue CUDA kernels on APIs
Expand All @@ -101,7 +103,7 @@ cuvsError_t cuvsResourcesDestroy(cuvsResources_t res);
* @param[in] stream cudaStream_t stream to queue CUDA kernels
* @return cuvsError_t
*/
cuvsError_t cuvsStreamSet(cuvsResources_t res, cudaStream_t stream);
CUVS_EXPORT cuvsError_t cuvsStreamSet(cuvsResources_t res, cudaStream_t stream);

/**
* @brief Get the cudaStream_t from a cuvsResources_t
Expand All @@ -110,15 +112,15 @@ cuvsError_t cuvsStreamSet(cuvsResources_t res, cudaStream_t stream);
* @param[out] stream cudaStream_t stream to queue CUDA kernels
* @return cuvsError_t
*/
cuvsError_t cuvsStreamGet(cuvsResources_t res, cudaStream_t* stream);
CUVS_EXPORT cuvsError_t cuvsStreamGet(cuvsResources_t res, cudaStream_t* stream);

/**
* @brief Syncs the current CUDA stream on the resources object
*
* @param[in] res cuvsResources_t opaque C handle
* @return cuvsError_t
*/
cuvsError_t cuvsStreamSync(cuvsResources_t res);
CUVS_EXPORT cuvsError_t cuvsStreamSync(cuvsResources_t res);

/**
* @brief Get the id of the device associated with this cuvsResources_t
Expand All @@ -127,7 +129,7 @@ cuvsError_t cuvsStreamSync(cuvsResources_t res);
* @param[out] device_id int the id of the device associated with res
* @return cuvsError_t
*/
cuvsError_t cuvsDeviceIdGet(cuvsResources_t res, int* device_id);
CUVS_EXPORT cuvsError_t cuvsDeviceIdGet(cuvsResources_t res, int* device_id);

/**
* @brief Create an Initialized opaque C handle for C++ type `raft::device_resources_snmg`
Expand All @@ -136,7 +138,7 @@ cuvsError_t cuvsDeviceIdGet(cuvsResources_t res, int* device_id);
* @param[in] res cuvsResources_t opaque C handle
* @return cuvsError_t
*/
cuvsError_t cuvsMultiGpuResourcesCreate(cuvsResources_t* res);
CUVS_EXPORT cuvsError_t cuvsMultiGpuResourcesCreate(cuvsResources_t* res);

/**
* @brief Create an Initialized opaque C handle for C++ type `raft::device_resources_snmg`
Expand All @@ -146,7 +148,7 @@ cuvsError_t cuvsMultiGpuResourcesCreate(cuvsResources_t* res);
* @param[in] device_ids DLManagedTensor* containing device IDs to use
* @return cuvsError_t
*/
cuvsError_t cuvsMultiGpuResourcesCreateWithDeviceIds(cuvsResources_t* res,
CUVS_EXPORT cuvsError_t cuvsMultiGpuResourcesCreateWithDeviceIds(cuvsResources_t* res,
DLManagedTensor* device_ids);

/**
Expand All @@ -155,7 +157,7 @@ cuvsError_t cuvsMultiGpuResourcesCreateWithDeviceIds(cuvsResources_t* res,
* @param[in] res cuvsResources_t opaque C handle
* @return cuvsError_t
*/
cuvsError_t cuvsMultiGpuResourcesDestroy(cuvsResources_t res);
CUVS_EXPORT cuvsError_t cuvsMultiGpuResourcesDestroy(cuvsResources_t res);

/**
* @brief Set a memory pool on all devices managed by the multi-GPU resources
Expand All @@ -164,7 +166,7 @@ cuvsError_t cuvsMultiGpuResourcesDestroy(cuvsResources_t res);
* @param[in] percent_of_free_memory Percent of free memory to allocate for the pool
* @return cuvsError_t
*/
cuvsError_t cuvsMultiGpuResourcesSetMemoryPool(cuvsResources_t res, int percent_of_free_memory);
CUVS_EXPORT cuvsError_t cuvsMultiGpuResourcesSetMemoryPool(cuvsResources_t res, int percent_of_free_memory);
/** @} */

/**
Expand All @@ -181,7 +183,7 @@ cuvsError_t cuvsMultiGpuResourcesSetMemoryPool(cuvsResources_t res, int percent_
* @param[in] bytes Size in bytes to allocate
* @return cuvsError_t
*/
cuvsError_t cuvsRMMAlloc(cuvsResources_t res, void** ptr, size_t bytes);
CUVS_EXPORT cuvsError_t cuvsRMMAlloc(cuvsResources_t res, void** ptr, size_t bytes);

/**
* @brief Deallocates device memory using RMM
Expand All @@ -191,7 +193,7 @@ cuvsError_t cuvsRMMAlloc(cuvsResources_t res, void** ptr, size_t bytes);
* @param[in] bytes Size in bytes to allocate
* @return cuvsError_t
*/
cuvsError_t cuvsRMMFree(cuvsResources_t res, void* ptr, size_t bytes);
CUVS_EXPORT cuvsError_t cuvsRMMFree(cuvsResources_t res, void* ptr, size_t bytes);

/**
* @brief Switches the working memory resource to use the RMM pool memory resource, which will
Expand All @@ -207,30 +209,30 @@ cuvsError_t cuvsRMMFree(cuvsResources_t res, void* ptr, size_t bytes);
* @param[in] managed Whether to use a managed memory resource as upstream resource or not
* @return cuvsError_t
*/
cuvsError_t cuvsRMMPoolMemoryResourceEnable(int initial_pool_size_percent,
CUVS_EXPORT cuvsError_t cuvsRMMPoolMemoryResourceEnable(int initial_pool_size_percent,
int max_pool_size_percent,
bool managed);
/**
* @brief Resets the memory resource to use the default memory resource (cuda_memory_resource)
* @return cuvsError_t
*/
cuvsError_t cuvsRMMMemoryResourceReset();
CUVS_EXPORT cuvsError_t cuvsRMMMemoryResourceReset();

/**
* @brief Allocates pinned memory on the host using RMM
* @param[out] ptr Pointer to allocated host memory
* @param[in] bytes Size in bytes to allocate
* @return cuvsError_t
*/
cuvsError_t cuvsRMMHostAlloc(void** ptr, size_t bytes);
CUVS_EXPORT cuvsError_t cuvsRMMHostAlloc(void** ptr, size_t bytes);

/**
* @brief Deallocates pinned memory on the host using RMM
* @param[in] ptr Pointer to allocated host memory to free
* @param[in] bytes Size in bytes to deallocate
* @return cuvsError_t
*/
cuvsError_t cuvsRMMHostFree(void* ptr, size_t bytes);
CUVS_EXPORT cuvsError_t cuvsRMMHostFree(void* ptr, size_t bytes);

/**
* @brief Get the version of the cuVS library
Expand All @@ -239,7 +241,7 @@ cuvsError_t cuvsRMMHostFree(void* ptr, size_t bytes);
* @param[out] patch Patch version
* @return cuvsError_t
*/
cuvsError_t cuvsVersionGet(uint16_t* major, uint16_t* minor, uint16_t* patch);
CUVS_EXPORT cuvsError_t cuvsVersionGet(uint16_t* major, uint16_t* minor, uint16_t* patch);

/**
* @brief Copy a matrix
Expand All @@ -256,7 +258,7 @@ cuvsError_t cuvsVersionGet(uint16_t* major, uint16_t* minor, uint16_t* patch);
* @param[in] src Pointer to DLManagedTensor to copy
* @param[out] dst Pointer to DLManagedTensor to receive copy of data
*/
cuvsError_t cuvsMatrixCopy(cuvsResources_t res, DLManagedTensor* src, DLManagedTensor* dst);
CUVS_EXPORT cuvsError_t cuvsMatrixCopy(cuvsResources_t res, DLManagedTensor* src, DLManagedTensor* dst);

/**
* @brief Slices rows from a matrix
Expand All @@ -267,7 +269,7 @@ cuvsError_t cuvsMatrixCopy(cuvsResources_t res, DLManagedTensor* src, DLManagedT
* @param[in] end Last row index to include in the output
* @param[out] dst Pointer to DLManagedTensor to receive slice from matrix
*/
cuvsError_t cuvsMatrixSliceRows(
CUVS_EXPORT cuvsError_t cuvsMatrixSliceRows(
cuvsResources_t res, DLManagedTensor* src, int64_t start, int64_t end, DLManagedTensor* dst);
/** @} */

Expand Down
18 changes: 18 additions & 0 deletions c/include/cuvs/core/export.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION.
* SPDX-License-Identifier: Apache-2.0
*/

#pragma once

// Symbol visibility macros for cuVS shared libraries.
// When CXX_VISIBILITY_PRESET is set to hidden, only symbols explicitly
// marked with CUVS_EXPORT will be visible in the shared library.
// CUVS_HIDDEN can be used to explicitly mark symbols as hidden.
#if (defined(__GNUC__) && !defined(__MINGW32__) && !defined(__MINGW64__))
#define CUVS_EXPORT __attribute__((visibility("default")))
#define CUVS_HIDDEN __attribute__((visibility("hidden")))
#else
#define CUVS_EXPORT
#define CUVS_HIDDEN
#endif
4 changes: 3 additions & 1 deletion c/include/cuvs/distance/distance.h
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION.
* SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION.
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once

#include <cuvs/core/export.h>

#ifdef __cplusplus
extern "C" {
#endif
Expand Down
4 changes: 3 additions & 1 deletion c/include/cuvs/distance/pairwise_distance.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
#include <cuvs/core/c_api.h>
#include <cuvs/distance/distance.h>

#include <cuvs/core/export.h>

#ifdef __cplusplus
extern "C" {
#endif
Expand Down Expand Up @@ -45,7 +47,7 @@ extern "C" {
* @param[in] metric distance to evaluate
* @param[in] metric_arg metric argument (used for Minkowski distance)
*/
cuvsError_t cuvsPairwiseDistance(cuvsResources_t res,
CUVS_EXPORT cuvsError_t cuvsPairwiseDistance(cuvsResources_t res,
DLManagedTensor* x,
DLManagedTensor* y,
DLManagedTensor* dist,
Expand Down
8 changes: 5 additions & 3 deletions c/include/cuvs/neighbors/all_neighbors.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
#include <dlpack/dlpack.h>
#include <stdint.h>

#include <cuvs/core/export.h>

#ifdef __cplusplus
extern "C" {
#endif
Expand Down Expand Up @@ -67,7 +69,7 @@ typedef struct cuvsAllNeighborsIndexParams* cuvsAllNeighborsIndexParams_t;
*
* @return cuvsError_t
*/
cuvsError_t cuvsAllNeighborsIndexParamsCreate(cuvsAllNeighborsIndexParams_t* index_params);
CUVS_EXPORT cuvsError_t cuvsAllNeighborsIndexParamsCreate(cuvsAllNeighborsIndexParams_t* index_params);

/**
* @brief Destroy an all-neighbors index parameters struct.
Expand All @@ -76,7 +78,7 @@ cuvsError_t cuvsAllNeighborsIndexParamsCreate(cuvsAllNeighborsIndexParams_t* ind
*
* @return cuvsError_t
*/
cuvsError_t cuvsAllNeighborsIndexParamsDestroy(cuvsAllNeighborsIndexParams_t index_params);
CUVS_EXPORT cuvsError_t cuvsAllNeighborsIndexParamsDestroy(cuvsAllNeighborsIndexParams_t index_params);

/** @} */

Expand All @@ -103,7 +105,7 @@ cuvsError_t cuvsAllNeighborsIndexParamsDestroy(cuvsAllNeighborsIndexParams_t ind
* datasets, `n_clusters` must be 1 (no batching); `overlap_factor` is ignored.
* Outputs always reside in device memory.
*/
cuvsError_t cuvsAllNeighborsBuild(cuvsResources_t res,
CUVS_EXPORT cuvsError_t cuvsAllNeighborsBuild(cuvsResources_t res,
cuvsAllNeighborsIndexParams_t params,
DLManagedTensor* dataset,
DLManagedTensor* indices,
Expand Down
Loading
Loading