我可以利用 GPU 来加速 C# 中的非图形相关操作,例如并行 for 循环吗?

问题描述 投票:0回答:1

我有以下 CRC 计算,它在不同的数据源上并行执行 12 次。

一旦 CPU 线程数耗尽,我可以将其卸载到 GPU,还是 GPU 不适合此类任务并且在 GPU 上进行此类计算没有意义?

如果这是问这个问题的错误地方,请您建议应该在哪里问。

private static readonly byte[] _crcLookup = new byte[1024];

public static uint CalculateCRC(byte[] data, uint lower, uint upper)
{
    uint offset = 0;
    uint addr = 0;

    var segment = data;

    uint crc = uint.MaxValue;
    addr = lower;
    while (addr <= upper)
    {
        crc = crc >> 8 ^ _crcLookup [(byte)(data[addr] ^ crc)];
        addr++;
    }

    crc = ~crc;
    return crc;
}

并行实施

var dataSegments = new ConcurrentBag<(byte[] data, uint lower, uint upper)>();

Parallel.ForEach(dataSegments, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, segment =>
{
    uint result = CalculateCRC(segment.data, segment.lower, segment.upper);
    // Do something with the result...
});
c# parallel-processing cuda gpu gpgpu
1个回答
0
投票

这是代码:

Here is the code:

private static readonly byte[] _crcLookup = new byte[1024];

public static uint CalculateCRC(byte[] data, uint lower, uint upper)
{
    uint offset = 0;
    uint addr = 0;

    var segment = data;

    uint crc = uint.MaxValue;
    addr = lower;
    while (addr <= upper)
    {
        crc = crc >> 8 ^ _crcLookup [(byte)(data[addr] ^ crc)];
        addr++;
    }

    crc = ~crc;
    return crc;
}

var dataSegments = new ConcurrentBag<(byte[] data, uint lower, uint upper)>();

Parallel.ForEach(dataSegments, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, segment =>
{
    uint result = CalculateCRC(segment.data, segment.lower, segment.upper);
    // Do something with the result...
});

在 C# 中使用 GPU 进行非图形操作(例如 CRC 计算)可能并不简单。虽然有像 CUDA.NET 这样的库允许使用 C# 进行 GPU 编程,但值得注意的是,并非所有操作都受益于 GPU 并行化。在某些情况下,在 CPU 和 GPU 内存之间传输数据的开销可能超过并行化带来的好处。

© www.soinside.com 2019 - 2024. All rights reserved.