System.NotImplementedException when generating bindings for Nvidia CUDA
Brief Description
The app fails to generate bindings for Nvidia CUDA library.
OS: Windows 10
Used headers
Download and install this library: https://developer.nvidia.com/cuda-downloads
My main goal was to generate the bindings for all files in that folder:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include\
cuda_runtime.h and cuda_runtime_api.h look the most interesting.
Used settings
public void Setup(Driver driver)
{
var options = driver.Options;
options.GeneratorKind = GeneratorKind.CSharp;
options.Quiet = false;
var module = options.AddModule("YCuda");
module.IncludeDirs.Add(@"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\include");
var headerDirectory = new DirectoryInfo("C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.7\\include");
var headers = headerDirectory.GetFiles();
// I've tried with this one as well and got the same error
//foreach (var header in headers)
//{
// module.Headers.Add(header.Name);
//}
module.Headers.Add("cuda_runtime.h");
module.LibraryDirs.Add(@"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\lib\x64");
var libDirectory = new DirectoryInfo("C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.7\\lib\\x64");
var libs = libDirectory.GetFiles();
foreach(var lib in libs)
{
module.Libraries.Add(lib.Name);
}
}
Target: C#
Other settings
I run it like this:
ConsoleDriver.Run(new YCudaLibrary());
Where YCudaLibrary is a class where my setup function is located.
Stack trace or incompilable generated code
Parsing libraries...
Parsed 'cublas.lib'
Parsed 'cublasLt.lib'
Parsed 'cuda.lib'
Parsed 'cudadevrt.lib'
Parsed 'cudart.lib'
Parsed 'cudart_static.lib'
Parsed 'cufft.lib'
Parsed 'cufftw.lib'
Parsed 'cufilt.lib'
Parsed 'curand.lib'
Parsed 'cusolver.lib'
Parsed 'cusolverMg.lib'
Parsed 'cusparse.lib'
Parsed 'nppc.lib'
Parsed 'nppial.lib'
Parsed 'nppicc.lib'
Parsed 'nppidei.lib'
Parsed 'nppif.lib'
Parsed 'nppig.lib'
Parsed 'nppim.lib'
Parsed 'nppist.lib'
Parsed 'nppisu.lib'
Parsed 'nppitc.lib'
Parsed 'npps.lib'
Parsed 'nvblas.lib'
Parsed 'nvjpeg.lib'
Parsed 'nvml.lib'
Parsed 'nvptxcompiler_static.lib'
Parsed 'nvrtc-builtins_static.lib'
Parsed 'nvrtc.lib'
Parsed 'nvrtc_static.lib'
Parsed 'OpenCL.lib'
Parsing code...
Parsed 'cuda_runtime.h'
Processing code...
Found ambiguous overload: __cudaOccupancyB2DHelper::operator=
Found ambiguous overload: cudaChannelFormatDesc::operator=
Found ambiguous overload: cudaArraySparseProperties::operator=
Found ambiguous overload: cudaArraySparseProperties::operator=
Found ambiguous overload: cudaArrayMemoryRequirements::operator=
Found ambiguous overload: cudaPitchedPtr::operator=
Found ambiguous overload: cudaExtent::operator=
Found ambiguous overload: cudaPos::operator=
Found ambiguous overload: cudaMemcpy3DParms::operator=
Found ambiguous overload: cudaMemcpy3DPeerParms::operator=
Found ambiguous overload: cudaMemsetParams::operator=
Found ambiguous overload: cudaAccessPolicyWindow::operator=
Found ambiguous overload: cudaHostNodeParams::operator=
Found ambiguous overload: cudaResourceDesc::operator=
Found ambiguous overload: cudaResourceDesc::operator=
Found ambiguous overload: cudaResourceDesc::operator=
Found ambiguous overload: cudaResourceDesc::operator=
Found ambiguous overload: cudaResourceDesc::operator=
Found ambiguous overload: cudaResourceDesc::operator=
Found ambiguous overload: cudaResourceViewDesc::operator=
Found ambiguous overload: cudaPointerAttributes::operator=
Found ambiguous overload: cudaFuncAttributes::operator=
Found ambiguous overload: cudaMemLocation::operator=
Found ambiguous overload: cudaMemAccessDesc::operator=
Found ambiguous overload: cudaMemPoolProps::operator=
Found ambiguous overload: cudaMemPoolPtrExportData::operator=
Found ambiguous overload: cudaMemAllocNodeParams::operator=
Found ambiguous overload: CUuuid_st::operator=
Found ambiguous overload: cudaDeviceProp::operator=
Found ambiguous overload: cudaIpcEventHandle_st::operator=
Found ambiguous overload: cudaIpcMemHandle_st::operator=
Found ambiguous overload: cudaExternalMemoryHandleDesc::operator=
Found ambiguous overload: cudaExternalMemoryHandleDesc::operator=
Found ambiguous overload: cudaExternalMemoryHandleDesc::operator=
Found ambiguous overload: cudaExternalMemoryBufferDesc::operator=
Found ambiguous overload: cudaExternalMemoryMipmappedArrayDesc::operator=
Found ambiguous overload: cudaExternalSemaphoreHandleDesc::operator=
Found ambiguous overload: cudaExternalSemaphoreHandleDesc::operator=
Found ambiguous overload: cudaExternalSemaphoreHandleDesc::operator=
Found ambiguous overload: cudaExternalSemaphoreSignalParams_v1::operator=
Found ambiguous overload: cudaExternalSemaphoreSignalParams_v1::operator=
Found ambiguous overload: cudaExternalSemaphoreSignalParams_v1::operator=
Found ambiguous overload: cudaExternalSemaphoreSignalParams_v1::operator=
Found ambiguous overload: cudaExternalSemaphoreSignalParams_v1::operator=
Found ambiguous overload: cudaExternalSemaphoreWaitParams_v1::operator=
Found ambiguous overload: cudaExternalSemaphoreWaitParams_v1::operator=
Found ambiguous overload: cudaExternalSemaphoreWaitParams_v1::operator=
Found ambiguous overload: cudaExternalSemaphoreWaitParams_v1::operator=
Found ambiguous overload: cudaExternalSemaphoreWaitParams_v1::operator=
Found ambiguous overload: cudaExternalSemaphoreSignalParams::operator=
Found ambiguous overload: cudaExternalSemaphoreSignalParams::operator=
Found ambiguous overload: cudaExternalSemaphoreSignalParams::operator=
Found ambiguous overload: cudaExternalSemaphoreSignalParams::operator=
Found ambiguous overload: cudaExternalSemaphoreSignalParams::operator=
Found ambiguous overload: cudaExternalSemaphoreWaitParams::operator=
Found ambiguous overload: cudaExternalSemaphoreWaitParams::operator=
Found ambiguous overload: cudaExternalSemaphoreWaitParams::operator=
Found ambiguous overload: cudaExternalSemaphoreWaitParams::operator=
Found ambiguous overload: cudaExternalSemaphoreWaitParams::operator=
Found ambiguous overload: dim3::operator=
Found ambiguous overload: cudaLaunchParams::operator=
Found ambiguous overload: cudaKernelNodeParams::operator=
Found ambiguous overload: cudaExternalSemaphoreSignalNodeParams::operator=
Found ambiguous overload: cudaExternalSemaphoreWaitNodeParams::operator=
Found ambiguous overload: cudaStreamAttrValue::operator=
Found ambiguous overload: cudaKernelNodeAttrValue::operator=
Found ambiguous overload: char1::operator=
Found ambiguous overload: uchar1::operator=
Found ambiguous overload: char2::operator=
Found ambiguous overload: uchar2::operator=
Found ambiguous overload: char3::operator=
Found ambiguous overload: uchar3::operator=
Found ambiguous overload: char4::operator=
Found ambiguous overload: uchar4::operator=
Found ambiguous overload: short1::operator=
Found ambiguous overload: ushort1::operator=
Found ambiguous overload: short2::operator=
Found ambiguous overload: ushort2::operator=
Found ambiguous overload: short3::operator=
Found ambiguous overload: ushort3::operator=
Found ambiguous overload: short4::operator=
Found ambiguous overload: ushort4::operator=
Found ambiguous overload: int1::operator=
Found ambiguous overload: uint1::operator=
Found ambiguous overload: int2::operator=
Found ambiguous overload: uint2::operator=
Found ambiguous overload: int3::operator=
Found ambiguous overload: uint3::operator=
Found ambiguous overload: int4::operator=
Found ambiguous overload: uint4::operator=
Found ambiguous overload: long1::operator=
Found ambiguous overload: ulong1::operator=
Found ambiguous overload: long2::operator=
Found ambiguous overload: ulong2::operator=
Found ambiguous overload: long3::operator=
Found ambiguous overload: ulong3::operator=
Found ambiguous overload: long4::operator=
Found ambiguous overload: ulong4::operator=
Found ambiguous overload: float1::operator=
Found ambiguous overload: float2::operator=
Found ambiguous overload: float3::operator=
Found ambiguous overload: float4::operator=
Found ambiguous overload: longlong1::operator=
Found ambiguous overload: ulonglong1::operator=
Found ambiguous overload: longlong2::operator=
Found ambiguous overload: ulonglong2::operator=
Found ambiguous overload: longlong3::operator=
Found ambiguous overload: ulonglong3::operator=
Found ambiguous overload: longlong4::operator=
Found ambiguous overload: ulonglong4::operator=
Found ambiguous overload: double1::operator=
Found ambiguous overload: double2::operator=
Found ambiguous overload: double3::operator=
Found ambiguous overload: double4::operator=
Found ambiguous overload: surfaceReference::operator=
Found ambiguous overload: textureReference::operator=
Found ambiguous overload: cudaTextureDesc::operator=
Found ambiguous overload: cudaCreateChannelDesc
Generating code...
Unhandled exception. System.NotImplementedException: The method or operation is not implemented.
at CppSharp.Extensions.PrimitiveTypeExtensions.GetInfo(PrimitiveType primitive, ParserTargetInfo targetInfo, Boolean& signed)
at CppSharp.Extensions.TypeExtensions.GetWidth(Type type, ParserTargetInfo targetInfo)
at CppSharp.Extensions.LayoutFieldExtensions.CalculateOffset(LayoutField field, LayoutField previousField, ParserTargetInfo targetInfo)
at CppSharp.Generators.CSharp.CSharpSources.GenerateClassInternalsFields(Class class, Boolean sequentialLayout)
at CppSharp.Generators.CSharp.CSharpSources.GenerateClassInternals(Class class)
at CppSharp.Generators.CSharp.CSharpSources.VisitClassDecl(Class class)
at CppSharp.AST.Class.Visit[T](IDeclVisitor`1 visitor)
at CppSharp.Generators.CSharp.CSharpSources.VisitDeclContext(DeclarationContext context)
at CppSharp.Generators.CodeGenerator.VisitNamespace(Namespace namespace)
at CppSharp.Generators.CSharp.CSharpSources.VisitNamespace(Namespace namespace)
at CppSharp.Generators.CodeGenerator.VisitTranslationUnit(TranslationUnit unit)
at CppSharp.AST.TranslationUnit.Visit[T](IDeclVisitor`1 visitor)
at CppSharp.Generators.CSharp.CSharpSources.Process()
at CppSharp.Generators.Generator.GenerateModule(Module module)
at CppSharp.Generators.Generator.Generate()
at CppSharp.Driver.GenerateCode()
at CppSharp.ConsoleDriver.Run(ILibrary library)
at CudaTest.Generator.Program.Main(String[] args)
Can you check at CppSharp.Extensions.PrimitiveTypeExtensions.GetInfo(PrimitiveType primitive, ParserTargetInfo targetInfo, Boolean& signed) and check with debugger which primitive type is throwing?
Can you check
at CppSharp.Extensions.PrimitiveTypeExtensions.GetInfo(PrimitiveType primitive, ParserTargetInfo targetInfo, Boolean& signed)and check with debugger which primitive type is throwing?
My app uses the nuget package, so I can't really see the internals.
I've downloaded the source code, kind of hoped to connect it to my solution and debug it. But, for some reason, there's no .sln file in this repository.
So, I did find the manual:
https://github.com/mono/CppSharp/blob/main/docs/GettingStarted.md#compiling-on-windowsvisual-studio
But, was completely wrong. The Compiling on Windows/Visual Studio section contains commands that execute .sh scripts. Obviously, there's no way to execute Linux shell scripts on Windows... Extremely confusing.
Anyway, I've started it in msvs developer command prompt after all. <-- had to play a guessing game for a while.
Indeed, the CppSharp.sln appeared. I've opened it in MSVS, switched it to debug, started the CLI app... and boom:
System.BadImageFormatException: 'Could not load file or assembly 'CppSharp.Parser.CLI, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. An attempt was made to load a program with an incorrect format.'
So, I gave up. No luck for me, no error logs for you. I guess you'll have to download the cuda library after all.
Obviously, there's no way to execute Linux shell scripts on Windows... Extremely confusing.
There is, with either MSYS2, or Cygwin or WSL.
Anyway, I've started it in msvs developer command prompt after all. <-- had to play a guessing game for a while.
Updated the docs to make this a bit more clear.
Did you follow the steps in the guide and got CppSharp to build correctly first?
Updated the docs to make this a bit more clear.
Thanks! I was about to suggest just that.
Did you follow the steps in the guide and got CppSharp to build correctly first?
Yes, I didn't even start adding my project to the solution. I was just trying to follow the guide, like clone the code, generate build files and build the solution. But it wouldn't build on me.
Anyway, I doesn't really matter if the source code builds or not, at least for me. Here's the blob, if you're interested in further investigation.
CppSharp.zip
Just try running CppSharp.CLI in debug mode and you'll see what I'm talking about.
Note: I've excluded build\llvm\llvm-791523-windows-vs2019-x64-RelWithDebInfo to save some space.
I'm going to use a nuget package instead, so I'd rather we get CppSharp to generate bindings Cuda this way or the other.