Microsoft Accelerator V2 - toArray2D вопрос - PullRequest
3 голосов
/ 13 января 2010

Я новичок в Microsoft.Accelerator. Взгляните на следующий код (это F #, но он похож на C #):

type FPA = Microsoft.ParallelArrays.FloatParallelArray

let fi = List.init 9 (fun i -> new FPA(i, [|10;10|])) 
let process (fi: FPA list) : FPA list = fi // complicated function
let newfi = process fi
let target = new DX9Target()
for newf in newfi do printfn "%A" (target.toArray2D(newf))

В основном я создаю список FPA и обрабатываю его так, чтобы каждый элемент в результирующем списке newfi зависел от всех элементов в списке fi. Наконец, я хотел бы получить итоговый список. И мой вопрос: должен ли я вызывать toArray2D для каждого отдельного элемента (FPA) в результирующем списке FPA? Мне кажется, что все вычисления выполняются каждый раз, когда я вызываю Array2D, что занимает очень много времени.

Спасибо за вашу помощь. Олдрич

1 Ответ

2 голосов
/ 13 января 2010

FPA представляет вычисление, которое должно быть выполнено. У вас есть два списка таких вычислений, fi и newfi. Из-за того, как вы определяете вещи, каждый элемент newfi является вычислением, которое нужно будет запускать независимо, чтобы получить его значение; даже если он определен в терминах общих базовых элементов fi, нет никакого способа воспользоваться этим фактом для вычисления базовых fi значений только один раз и их повторного использования. Если вы хотите, чтобы эти fi вычисления выполнялись только один раз, вам необходимо выполнить одно из следующих действий:

  1. Получите результаты вычислений fi (например, с помощью toArray2D) и создайте список newfi на основе этих вычисленных значений.
  2. Создайте одно вычисление, которое представляет все newfi значения в одном массиве - вам может потребоваться быть немного умным, чтобы составить такое вычисление, но это может позволить вам вычислить все значения одновременно, без необходимости пересчитывать 1016 * значения.
...