gpt4 book ai didi

f# - C++ AMP库对F#有用吗?

转载 作者:行者123 更新时间:2023-12-04 18:11:11 24 4
gpt4 key购买 nike

我正在尝试使用F#中的C++ AMP库,作为使用GPU并行工作的一种方式。但是,我得到的结果似乎并不直观。

在C++中,我制作了一个具有一个函数的库,该函数使用AMP将数组中的所有数字平方:

extern "C" __declspec ( dllexport ) void _stdcall square_array(double* arr, int n)
{
// Create a view over the data on the CPU
array_view<double,1> dataView(n, &arr[0]);

// Run code on the GPU
parallel_for_each(dataView.extent, [=] (index<1> idx) restrict(amp)
{
dataView[idx] = dataView[idx] * dataView[idx];
});

// Copy data from GPU to CPU
dataView.synchronize();
}

(代码改编自MSDN上Igor Ostrovsky的 blog。)

然后,我编写了以下F#,以将任务并行库(TPL)与AMP进行比较:
// Print the time needed to run the given function
let time f =
let s = new Stopwatch()
s.Start()
f ()
s.Stop()
printfn "elapsed: %d" s.ElapsedTicks

module CInterop =
[<DllImport("CPlus", CallingConvention = CallingConvention.StdCall)>]
extern void square_array(float[] array, int length)

let options = new ParallelOptions()
let size = 1000.0
let arr = [|1.0 .. size|]
// Square the number at the given index of the array
let sq i =
do arr.[i] <- arr.[i] * arr.[i]
()
// Square every number in the array using TPL
time (fun() -> Parallel.For(0, arr.Length - 1, options, new Action<int>(sq)) |> ignore)

let arr2 = [|1.0 .. size|]
// Square every number in the array using AMP
time (fun() -> CInterop.square_array(arr2, arr2.Length))

如果我将数组大小设置为10这样的琐碎数字,则需要TPL〜22K滴答声和AMP〜10K滴答声来完成。这就是我的期望。据我了解,GPU(因此为AMP)应该比TPL更适合这种情况,在这种情况下,工作被分割为很小的部分。

但是,如果我将阵列大小增加到1000,则TPL现在需要约30K滴答,而AMP需要约70K滴答。从那开始情况变得越来越糟。对于一百万个阵列,AMP所花费的时间是TPL的近1000倍。

由于我期望GPU(例如AMP)在这种任务上会更好,因此我想知道我在这里缺少什么。

我的图形卡是具有1GB的GeForce 550 Ti,据我所知,这不是一个懒散的显卡。我知道使用PInvoke调用AMP代码会产生开销,但我希望这是一笔固定费用,将在较大的数组大小上摊销。我相信该数组是通过引用传递的(尽管我可能错了),所以我不希望复制该数组会产生任何开销。

谢谢大家的建议。

最佳答案

在GPU和CPU之间来回传输数据需要花费时间。您很可能在这里测量PCI Express总线带宽。平方1M的浮点数对于GPU来说是小菜一碟。

使用Stopwach类来衡量AMP的性能也不是一个好主意,因为GPU调用可以异步发生。在您的情况下还可以,但是如果仅测量计算部分(parallel_for_each),则此方法将无效。我认为您可以为此使用D3D11性能计数器。

关于f# - C++ AMP库对F#有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14018195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com