C#未声明可空的int[]为何被判定为可空?ILGPU加载Kernel报错
报错原因
这个报错和C#的可空类型特性无关,你理解错了问题方向:
- 报错描述里的「非空值类型」要求,本质是ILGPU对Kernel参数的类型限制:所有传入Kernel的泛型参数必须是值类型,或是ILGPU提供的特殊内存包装类型(比如你代码里已经用到的
ArrayView<T>),不能直接使用C#原生托管类型。 - 你传入的
int[]是C#原生托管数组,属于引用类型,天然不符合值类型的要求,因此触发了该报错。
修复方案
你需要把托管数组包装为ILGPU可识别的GPU内存视图再传入Kernel,步骤如下:
- 将Kernel泛型参数中的
int[]替换为ArrayView<int> - 调用Kernel前先把待传入的int数组分配到GPU显存,示例代码:
// 假设你要传入的CPU侧int数组为sourceInts using var gpuIntBuffer = gpu.Allocate<int>(sourceInts.Length); // 把CPU数据拷贝到GPU显存 gpuIntBuffer.CopyFromCPU(sourceInts); // 加载Kernel时使用ArrayView<int>作为参数类型 var krnl = gpu.LoadAutoGroupedStreamKernel<Index1, ArrayView<byte>, ArrayView<int>>(krnCopyStringToCard); // 调用Kernel时传入缓冲区的View属性 krnl(new Index1(你需要的线程数量), byteArrayView, gpuIntBuffer.View);
- 如果需要读取GPU处理后的int数据,调用
gpuIntBuffer.CopyToCPU(目标CPU数组)即可把数据从GPU回传到主内存。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

