我有以下 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...
});
这是代码:
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 内存之间传输数据的开销可能超过并行化带来的好处。