2017-01-08 4 views
0

"Fody/Alea.CUDA : clrobj (cGPU)에 llvm이 없습니다."라는 오류가 발생한 코드 ALEA 라이브러리를 사용하여 NVIDIA 커널에 구조체 배열을 전달하려고합니다. 다음은 간단한 코드입니다. 코드를 단순하게 유지하기 위해 출력 수집 기능을 제거했습니다. 난 단지 struct의 배열을 GPU에 순간적으로 보낼 수 있어야한다.구조체 배열을 GPU 커널 (ALEA 라이브러리)에 전달할 때 clrobj (<class name>)에 llvm이 없습니다.

using Alea.CUDA; 
using Alea.CUDA.Utilities; 
using Alea.CUDA.IL; 

namespace GPUProgramming 
{ 
    public class cGPU 
    { 
    public int Slice; 
    public float FloatValue; 
    } 

    [AOTCompile(AOTOnly = true)] 
    public class TestModule : ILGPUModule 
    { 
    public TestModule(GPUModuleTarget target) : base(target) 
    { 
    } 

    const int blockSize = 64; 

    [Kernel] 
    public void Kernel2(deviceptr<cGPU> Data, int n) 
    { 
     var start = blockIdx.x * blockDim.x + threadIdx.x; 
     int ind = threadIdx.x; 

     var sharedSlice =   __shared__.Array<int>(64); 
     var sharedFloatValue = __shared__.Array<float>(64); 

     if (ind < n && start < n) 
     { 
     sharedSlice[ind] = Data[start].Slice; 
     sharedFloatValue[ind] = Data[start].FloatValue; 
     Intrinsic.__syncthreads(); 
     } 
    } 

    public void Test2(deviceptr<cGPU> Data, int n, int NumOfBlocks) 
    { 
     var GridDim = new dim3(NumOfBlocks, 1); 
     var BlockDim = new dim3(64, 1); 

     try 
     { 
     var lp = new LaunchParam(GridDim, BlockDim); 
     GPULaunch(Kernel2, lp, Data, n); 
     } 
     catch (CUDAInterop.CUDAException x) 
     { 
     var code = x.Data0; 
     Console.WriteLine("ErrorCode = {0}", code); 
     } 
    } 
    public void Test2(cGPU[] Data) 
    { 
     int NumOfBlocks = Common.divup(Data.Length, blockSize); 
     using (var d_Slice = GPUWorker.Malloc(Data)) 
     { 
     try 
     { 
      Test_Kernel2(d_Slice.Ptr, Data.Length, NumOfBlocks); 
     } 
     catch (CUDAInterop.CUDAException x) 
     { 
      var code = x.Data0; 
      Console.WriteLine("ErrorCode = {0}", x.Data0); 
     } 
     } 
    } 
    } 
} 
+0

귀하의 데이터는 참조 유형 인 클래스입니다. 구조체를 사용해보십시오. 참조 유형은 Gpu에 잘 맞지 않습니다. 힙에 작은 메모리를 할당해야하기 때문에. –

+0

물론. 당신 말이 맞아요. 나는 그것을 구조체로 선언했다고 생각했다. 여기서 코드를 공유하는 것이 좋습니다. cGPU를 구조체로 정의한 후 오류가 사라지고 이제는 GPU에 구조체의 큰 배열을 보낼 수 있습니다. 고맙습니다. 대부분의 코딩 문제는 지금까지 한 단어 밖에 없습니다. 그리고 또 여기. 저는 stackoverflow를 처음 사용하고 있습니다. 내 질문에 대한 대답으로 선택할 수 있도록이 주석을 답으로 써야 할 것 같네요. –

+0

잘 작동합니다. 나는 그 텍스트를 대답으로 복사했습니다. –

답변

0

귀하의 데이터는 참조 유형입니다. 구조체를 사용해보십시오. 참조 유형은 Gpu에 잘 맞지 않습니다. 힙에 작은 메모리를 할당해야하기 때문에.

+0

답해 주셔서 감사합니다. 나는 수업을 사용하고 있다는 것을 몰랐다. 구조체로 변경하면 오류가 사라졌습니다. –