Conflict problem between Cuda and Maya

Maya는 MTypes.h에 short2, short3, long2, long3, int2, int3, float2, float3, double2, double3, double4 등의 자료형을 정의하여 사용한다. 용감하게도 어떠한 prefix나 namespace도 사용하지 않는다.

Cuda는 vector_types.h에 int2, int3, float2, float3 등의 자료형을 정의하여 사용한다. Cuda 또한 용감하게도 어떠한 prefix나 namespace소 사용하지 않는다.

Maya plug-in에서 사용하는 헤더파일(.h)에서

#include <cuda_runtime.h>

이나

#include <vector_types.h>

을 해주면 자연스럽게 충돌이 일어난다. (소스파일(.cpp)에서는 문제가 되지 않는다.)

만약 Maya plug-in에서 사용하는 헤더파일(.h)에서 Cuda에서 정의하는 자료형을 사용한다면 다음과 같이 해결할 수 있다.

namespace Cuda
{
   #include <vector_types.h>
}

class A
{
   public:
      Cuda::float3 a;
}

하지만, 만약 Maya plug-in에서 사용하는 헤더파일(.h)에서

#include <cuda_runtime.h>

을 사용한다면 위의 방법으로는 해결이 되지 않는다.

Maya나 Cuda 둘 중 한 곳의 자료형을 재정의 해주어야 한다.

방법1) Cuda의 자료형을 재정의하는 방법

#include <cuda.h>
#include <cuda_runtime.h>

#define short2 CUDA_short2
#define short3 CUDA_short3
#define long2 CUDA_long2
#define long3 CUDA_long3
#define int2 CUDA_int2
#define int3 CUDA_int3
#define float2 CUDA_float2
#define float3 CUDA_float3
#define double2 CUDA_double2
#define double3 CUDA_double3
#define double4 CUDA_double4

#include <maya/MTypes.h>

방법2) Maya의 자료형을 재정의하는 방법

#include <maya/MTypes.h>

#define short2 MAYA_short2
#define short3 MAYA_short3
#define long2 MAYA_long2
#define long3 MAYA_long3
#define int2 MAYA_int2
#define int3 MAYA_int3
#define float2 MAYA_float2
#define float3 MAYA_float3
#define double2 MAYA_double2
#define double3 MAYA_double3
#define double4 MAYA_double4

#include <cuda.h>
#include <cuda_runtime.h>

헤더파일(.h)의 순서가 중요하다.

답글 남기기