"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);
}
}
}
}
}
귀하의 데이터는 참조 유형 인 클래스입니다. 구조체를 사용해보십시오. 참조 유형은 Gpu에 잘 맞지 않습니다. 힙에 작은 메모리를 할당해야하기 때문에. –
물론. 당신 말이 맞아요. 나는 그것을 구조체로 선언했다고 생각했다. 여기서 코드를 공유하는 것이 좋습니다. cGPU를 구조체로 정의한 후 오류가 사라지고 이제는 GPU에 구조체의 큰 배열을 보낼 수 있습니다. 고맙습니다. 대부분의 코딩 문제는 지금까지 한 단어 밖에 없습니다. 그리고 또 여기. 저는 stackoverflow를 처음 사용하고 있습니다. 내 질문에 대한 대답으로 선택할 수 있도록이 주석을 답으로 써야 할 것 같네요. –
잘 작동합니다. 나는 그 텍스트를 대답으로 복사했습니다. –