2017-05-10 42 views
2

我试图访问System.Collections.Generic.IList<T>的值,这是在Alea.Gpu.Default.For之外声明的。在Alea.Gpu.Default.For访问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中使用值的正确方法是什么?

回答

2

目前,AleaGPU仅适用于数组。 List通常需要动态内存分配,比如add元素,这在GPU中效率不高。