call_external 질문

게시판 IDL Q&A call_external 질문

1 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #3169 Reply
      신대규
      손님

      안녕하세요

      call_external을 사용해 intel mkl에서 제공하는 함수들을 사용할 수 있는지 궁금합니다.

      아래 예제 코드입니다.

      #include <stdio.h>
      #include <stdlib.h>
      #include “mkl_lapacke.h”
      #include “idl_export.h”
      __declspec(dllexport) void dee(int argc, void *argv[]) {
      double *vxgsw;
      result = (double *) argv[0];
      *result = 2;
      {

      위 코드를 사용해 dll을 만들어 call_external을 사용하면 result를 문제 없이 idl로 반환 받을 수 있는데요.
      위처럼 간단한 코드 뿐만이 아니라 여러가지 복잡한 작업을 해도 문제는 발견하지 못했습니다.

      문제는 위 c 코드 안에 mkl 함수들을 사용하면 idlde가 꺼집니다. 가령 예를 들어 eigenvalue를 구하는 함수인
      LAPACKE_dgeev를 사용한다면, 코드가 실행되지 않고 꺼져 버립니다.
      dll을 만들지 않고 실행파일을 만들어 실행하면 잘 되긴 합니다.
      spawn는 input, output의 교환이 자유롭지 못해 사용하기가 불편하구요.

      혹시 해결 방법을 구할 수 있을지요~?

    • #3174 Reply
      Jonghyuk Yi
      회원

      CALL_EXTERNAL 함수로 DLL을 호출할 때 발생하는 IDL 종료 현상에 대해서는 원인을 찾는 것이 어렵지 않을까 생각합니다. IDL은 기본적으로 IDL이 사용하는 메모리 바깥쪽의 일에 대해서 깊이 조사하고 제어하는 기능이 없습니다. Error Message를 내는 그런 상황도 아니어서 원인 규명이 쉽지는 않을 것 같습니다.

      1) 말씀하신 SPAWN의 PIPE 기능을 이용하여 exe 프로그램과 데이터를 주고 받으며 진행하는 방법으로는 해결할 수 있다면 가장 안전한 방법이 될 것 같습니다.
      IDL 도움말에서 Using Spawn and Pipes 라는 글의 내용으로 해결될 수 있다면 좋겠습니다.
      “Spawn PIPE”로 검색하여 찾으실 수 있습니다.

      2) LAPACKE_dgeev 함수에 대해 알지 못하지만, IDL에도 LAPACK이 내장되어 있습니다. IDL 내장함수로 처리될 수 있다면 더 안전한 방법이 될 수 있을 것 같습니다. 다만, 말씀하신 함수와 기능이 같은지는 모르겠습니다.
      IDL 도움말에서 LAPACK으로 검색하여 찾으실 수 있습니다. IDL LAPACK 루틴들은 LA_ 로 시작합니다.

1 답변 글타래를 보이고 있습니다
'call_external 질문'에 답변달기
글쓴이 정보: