我正在使用 Hybridizer 计算 FloatResidentArray 的总和,但由于在最终的 AtomicExpr.apply 语句中需要一个 ref 语句,所以我无法将计算出的总和返回给设备(或主机)。考虑以下基于 Altimesh 提供的 GenericReduce 示例的代码。该代码采用长度为N的浮点数的设备驻留数组a并计算总数——该值放在total[0]中。
[Kernel]
public static void Total(FloatResidentArray a, int N, float[] total)
{
var cache = new SharedMemoryAllocator<float>().allocate(blockDim.x);
int tid = threadIdx.x + blockDim.x * blockIdx.x;
int cacheIndex = threadIdx.x;
float sum = 0f;
while (tid < N)
{
sum = sum + a[tid];
tid += blockDim.x * gridDim.x;
}
cache[cacheIndex] = sum;
CUDAIntrinsics.__syncthreads();
int i = blockDim.x / 2;
while (i != 0)
{
if (cacheIndex < i)
{
cache[cacheIndex] = cache[cacheIndex] + cache[cacheIndex + i];
}
CUDAIntrinsics.__syncthreads();
i >>= 1;
}
if (cacheIndex == 0)
{
AtomicExpr.apply(ref total[0], cache[0], (x, y) => x + y);
}
}
上面的代码无法编译,因为您不能在同一参数列表中传递 float[] 和 FloatResidentArray。
如果 total 定义为 FloatResidentArray 本身,那么编译器将不允许在最后一行代码中使用 ref 关键字。
如果我只是传递一个浮点数,则返回的变量不会用总数更新。
如果我传递一个 ref float - 然后程序在 HybRunner 包装上面的代码以创建动态的地方抛出一个运行时错误 - 错误消息是
不支持引用的值类型
我如何返回总数?– 无论是设备还是主机内存 – 两者都是可以接受的。
白猪掌柜的
相关分类