[VitisAI] Add External EP Loader (#26627)
## [VitisAI] Add External EP Loader
### Description
This PR introduces a dynamic external execution provider loading
mechanism for the VitisAI execution provider, enabling runtime loading
of alternative execution providers through a plugin-style architecture.
### Key Changes
#### 1. **New External EP Library Infrastructure** (`global_api.cc`)
- Added `ExternalEpLibaray` class to dynamically load external execution
provider libraries at runtime
- Implemented complete library lifecycle management (loading, unloading,
symbol resolution)
- Added global registry (`g_external_ep_libaries`) with caching to avoid
redundant library loading
- Created `CreateExecutionProviderFromAnotherEp()` function to
instantiate execution providers from external libraries
**Implementation Details:**
- **Simplified symbol resolution**: Only resolves the essential
`GetProvider` symbol (required)
- **Removed optional symbols**: No longer attempts to resolve
`CreateEpFactories` or `RyzenAI_SetSessionOptions`
- Lazy initialization pattern with `Ensure()` method
- Safe cleanup with `Clear()` method and proper error handling
- Platform-agnostic library loading using `LIBRARY_PREFIX` and
`LIBRARY_EXTENSION` macros
#### 2. **API Extension** (`global_api.h`)
- Declared new public function: `CreateExecutionProviderFromAnotherEp()`
- Added required includes:
- `core/framework/execution_provider.h` for `IExecutionProvider`
interface
- `<memory>` for smart pointer support
#### 3. **Factory Integration** (`vitisai_provider_factory.cc`)
- Integrated external EP loading into the VitisAI provider factory
workflow
- Added provider option check for `external_ep_libray` key
- **Logic Flow**:
1. Check if `external_ep_libray` option is specified
2. If yes, load and return the external execution provider
3. If no, create and return standard VitisAI execution provider
Co-authored-by: Yueqing Zhang <yueqingz@amd.com>