static void Do() { var c = 4; var inArr = new int32 [c]; for (int _i = 0; _i < c; _i++) { inArr[_i] = 2; } inArr[c-2] = 1; int32 size = inArr.Length; var rules = new Rule[] {new Rule(1,2,3,0,0),new Rule(2,3,2,0,0),new Rule(2,1,0,0,0),new Rule(3,2,0,0,0)}; var nTermRules = (from rule in rules where rule.c > 0 select rule).ToArray(); int32 nTerms = 3; string platformName = "*"; Cl.DeviceType deviceType = Cl.DeviceType.Default; ComputeProvider provider; try { provider = ComputeProvider.Create(platformName, deviceType); } catch (PlatformNotSupportedException ex) { Console.WriteLine(ex.Message); return; } var commandQueue = new CommandQueue(provider, provider.Devices.First()); var bArr = new int32[size * size * nTerms * cellDataRepresentationLength]; var rulesArr = new uint32[nTermRules.Length * ruleRepresentationLength]; for (int i = 0; i < size; i++) { for (int j = 0; j < rules.Length; j++) { if (inArr[i] == (rules[j]).b && (rules[j]).c == 0) { var _base = (i * nTerms + (int)(rules[j].a - 1)) * cellDataRepresentationLength; bArr[_base] = rules[j].a; //bArr[_base + 1] = 0; //bArr[_base + 2] = (rules[j].lblNum == 0 ? 1 : 0); ///bArr[_base + 3] = rules[j].lblNum; //bArr[_base + 4] = rules[j].lblWeight; } } } for (int i = 0; i < nTermRules.Length; i++) { var _base = i * ruleRepresentationLength; rulesArr[_base] = (uint32)(uint)(nTermRules[i].a << 16 | nTermRules[i].b); rulesArr[_base + 1] = (uint32)(uint)nTermRules[i].c; //rulesArr[_base + 3] = rules[i].lblNum; //rulesArr[_base + 4] = rules[i].lblWeight; } var buffer = new Buffer<int32>(provider, Operations.ReadWrite, Memory.Device, bArr); var rulesBuffer = new Buffer<uint32>(provider, Operations.ReadOnly, Memory.Device, rulesArr); int32 rLength = nTermRules.Length; var processRow = provider.Compile<_1D, int32, Buffer<int32>, Buffer<uint32>>( (range, l, a, _rules) => from r in range let i = r.GlobalID0 let nT = nTerms let _base = nT * size let res_id_base = (l * _base) + i * nT let iter = provider.Loop(0, l, kIdx=> from k in kIdx let left_base_idx = (k * _base) + i * nTerms let right_base_idx = ((l - k - 1) * _base) + (k + i + 1) * nTerms let iter2 = provider.Loop(0, rLength, rIdxs => from rId in rIdxs let rule_base = rId * ruleRepresentationLength let rule_a_b = _rules[rule_base] let rule_a = (int)((rule_a_b >> 16) & 0xFFFF) let rule_b = (int)(rule_a_b & 0xFFFF) let rule_c = (int)(_rules[rule_base + 1] | 0) let res_id = res_id_base + ((int)(uint)rule_a - 1) select new[]{(rule_c != 0 & rule_c == a[right_base_idx + (rule_c - 1)] & rule_b == a[left_base_idx + (rule_b - 1)]) ? a[res_id] <= rule_a : ((Brahma.Set<int32>)null)}) select (Brahma.Set<int32>[])null) select (Brahma.Set<int32>[])null); for (int l = 1; l < size; l++) { commandQueue.Add(processRow.Run(new _1D(size - l), l, buffer, rulesBuffer)).Finish(); } commandQueue.Add(buffer.Read(0, size * size * nTerms * cellDataRepresentationLength, bArr)).Finish(); toMatrix(bArr, (int)(size * nTerms * cellDataRepresentationLength)); buffer.Dispose(); commandQueue.Dispose(); provider.Dispose(); }