Код: Выделить всё
[LibraryImport("cudnn64_9.dll", EntryPoint = "cudnnBackendSetAttribute")]
private unsafe static partial int CudnnBackendSetAttribute(IntPtr descriptor, int attributeName, int attributeType, long elementCount, void* arrayOfElements);
public unsafe static void SetAttribute(IntPtr descriptor, CuDnnBackendAttribute attributeName, CuDnnBackendAttributeTyp attributeType, long elementCount, void* value)
{
CudaErrorHandler.ExecuteWithCudnnErrorHandling(() => CudnnBackendSetAttribute(descriptor, (int)attributeName, (int)attributeType, elementCount, value));
}
Код: Выделить всё
// Works fine
CudaDNN.SetAttribute(fpropDesc, CuDnnBackendAttribute.CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_X, CuDnnBackendAttributeTyp.CUDNN_TYPE_BACKEND_DESCRIPTOR, 1, &xDesc);
// Causes runtime error
CudaDNN.SetAttribute(fpropDesc, CuDnnBackendAttribute.CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_X, CuDnnBackendAttributeTyp.CUDNN_TYPE_BACKEND_DESCRIPTOR, 1, xDesc.ToPointer());
Код: Выделить всё
System.Runtime.InteropServices.SEHException: "External component has thrown an exception."
- &IntPtr дает мне адрес IntPtr себя в управляемой памяти.
- .ToPointer() предоставляет указатель, который обертывает IntPtr, указывая на
фактический ресурс в неуправляемой памяти.
Если я прав, что использование &IntPtr означает, что я передаю адрес управляемого объекта, то я не понимаю, почему библиотека cuDNN обрабатывает его правильно и без проблем интерпретирует . С другой стороны, использование .ToPointer() приводит к исключению, показанному выше.
Мои вопросы: - Почему здесь работает использование &IntPtr, а .ToPointer() нет?
- Может ли это быть связано с тем, как обрабатывается маршаллер P/Invoke или CLR
Конкретно IntPtr? - Существует ли какой-то скрытый механизм, который делает &IntPtr подходящим
для передачи в неуправляемый код, несмотря на то, что это управляемый адрес? - Есть ли какой-либо передовой опыт или более глубокое понимание того, почему
IntPtr.ToPointer() может вызвать такую проблему, особенно при работе
в небезопасном контексте с внешними библиотеками, такими как cuDNN? >
Заранее спасибо!
Подробнее здесь: https://stackoverflow.com/questions/791 ... t-p-invoke