在 Alea.Gpu.Default.For 中访问 IList<T>
Accessing IList<T> inside Alea.Gpu.Default.For
我正在尝试访问在 Alea.Gpu.Default.For
之外声明的 System.Collections.Generic.IList<T>
的值。
[GpuManaged]
private void Evaluate_Caching(IList<TGenome> genomeList)
{
var gpu = Gpu.Default;
gpu.For(0, genomeList.Count - 1, i =>
{
TGenome genome = genomeList[i];
TPhenome phenome = (TPhenome)genome.CachedPhenome;
if (null == phenome)
{ // Decode the phenome and store a ref against the genome.
phenome = _genomeDecoder.Decode(genome);
genome.CachedPhenome = phenome;
}
if (null == phenome)
{ // Non-viable genome.
genome.EvaluationInfo.SetFitness(0.0);
genome.EvaluationInfo.AuxFitnessArr = null;
}
else
{
FitnessInfo fitnessInfo = _phenomeEvaluator.Evaluate(phenome);
genome.EvaluationInfo.SetFitness(fitnessInfo._fitness);
genome.EvaluationInfo.AuxFitnessArr = fitnessInfo._auxFitnessArr;
}
});
}
参考之前提出的问题之一 iterate-over-a-collection-of-custom-classes-with-alea-gpu 我也在 App.config
中启用了 <memory allowNonBlittableMemoryTransfer="true"/>
。
但是我收到一个错误
"Cannot get field "genomeList".
Possible reasons:
-> The field type is not supported.
-> In closure class, the field doesn't have [GpuParam] attribute.
Diagnostics:
-> Struct: ref(dyn{ i32 }(m:<Evaluate_Caching>b__0)):_O_
-> FieldName: genomeList
Source location stack:
-> in E:\_turingProjects\_csProjects\Gpu_Project\GpuParallelGenomeListEvaluator.cs(183,17-183,48)
-> at Evaluators.GpuParallelGenomeListEvaluator`2+<>c__DisplayClass17_0[SharpNeat.Genomes.Neat.NeatGenome,SharpNeat.Phenomes.IBlackBox].[Void <Evaluate_Caching>b__0(Int32)]
-> at Alea.Parallel.Device.DeviceFor.[Void Kernel(Int32, Int32, System.Action`1[System.Int32])]
-> at defining runtime64 (sm50,64bit)
Loading method as kernel:
-> Method: Alea.Parallel.Device.DeviceFor.[Void Kernel(Int32, Int32, System.Action`1[System.Int32])]
-> InstanceOpt: <None>
-> Argument.#0: 0
-> Argument.#1: 1999
-> Argument.#2: System.Action`1[System.Int32]
错误的可能原因是什么?在 Gpu.For 中使用值的正确方法是什么?
目前,AleaGPU 仅适用于数组。 List通常需要动态分配内存,比如添加元素,在GPU上效率不高。
我正在尝试访问在 Alea.Gpu.Default.For
之外声明的 System.Collections.Generic.IList<T>
的值。
[GpuManaged]
private void Evaluate_Caching(IList<TGenome> genomeList)
{
var gpu = Gpu.Default;
gpu.For(0, genomeList.Count - 1, i =>
{
TGenome genome = genomeList[i];
TPhenome phenome = (TPhenome)genome.CachedPhenome;
if (null == phenome)
{ // Decode the phenome and store a ref against the genome.
phenome = _genomeDecoder.Decode(genome);
genome.CachedPhenome = phenome;
}
if (null == phenome)
{ // Non-viable genome.
genome.EvaluationInfo.SetFitness(0.0);
genome.EvaluationInfo.AuxFitnessArr = null;
}
else
{
FitnessInfo fitnessInfo = _phenomeEvaluator.Evaluate(phenome);
genome.EvaluationInfo.SetFitness(fitnessInfo._fitness);
genome.EvaluationInfo.AuxFitnessArr = fitnessInfo._auxFitnessArr;
}
});
}
参考之前提出的问题之一 iterate-over-a-collection-of-custom-classes-with-alea-gpu 我也在 App.config
中启用了 <memory allowNonBlittableMemoryTransfer="true"/>
。
但是我收到一个错误
"Cannot get field "genomeList".
Possible reasons:
-> The field type is not supported.
-> In closure class, the field doesn't have [GpuParam] attribute.
Diagnostics:
-> Struct: ref(dyn{ i32 }(m:<Evaluate_Caching>b__0)):_O_
-> FieldName: genomeList
Source location stack:
-> in E:\_turingProjects\_csProjects\Gpu_Project\GpuParallelGenomeListEvaluator.cs(183,17-183,48)
-> at Evaluators.GpuParallelGenomeListEvaluator`2+<>c__DisplayClass17_0[SharpNeat.Genomes.Neat.NeatGenome,SharpNeat.Phenomes.IBlackBox].[Void <Evaluate_Caching>b__0(Int32)]
-> at Alea.Parallel.Device.DeviceFor.[Void Kernel(Int32, Int32, System.Action`1[System.Int32])]
-> at defining runtime64 (sm50,64bit)
Loading method as kernel:
-> Method: Alea.Parallel.Device.DeviceFor.[Void Kernel(Int32, Int32, System.Action`1[System.Int32])]
-> InstanceOpt: <None>
-> Argument.#0: 0
-> Argument.#1: 1999
-> Argument.#2: System.Action`1[System.Int32]
错误的可能原因是什么?在 Gpu.For 中使用值的正确方法是什么?
目前,AleaGPU 仅适用于数组。 List通常需要动态分配内存,比如添加元素,在GPU上效率不高。