You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#未声明可空的int[]为何被判定为可空?ILGPU加载Kernel报错

报错原因

这个报错和C#的可空类型特性无关,你理解错了问题方向:

  • 报错描述里的「非空值类型」要求,本质是ILGPU对Kernel参数的类型限制:所有传入Kernel的泛型参数必须是值类型,或是ILGPU提供的特殊内存包装类型(比如你代码里已经用到的ArrayView<T>),不能直接使用C#原生托管类型。
  • 你传入的int[]是C#原生托管数组,属于引用类型,天然不符合值类型的要求,因此触发了该报错。
修复方案

你需要把托管数组包装为ILGPU可识别的GPU内存视图再传入Kernel,步骤如下:

  1. 将Kernel泛型参数中的int[]替换为ArrayView<int>
  2. 调用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);
  1. 如果需要读取GPU处理后的int数据,调用gpuIntBuffer.CopyToCPU(目标CPU数组)即可把数据从GPU回传到主内存。

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 03:09:02