C# 如何将指向非托管内存(IntPtr)的指针传递给Alea CUDA内核?
我有一个C# 如何将指向非托管内存(IntPtr)的指针传递给Alea CUDA内核?,c#,aleagpu,C#,Aleagpu,我有一个IntPtr hData,它指向存储在非托管内存中的数据数组的开头。当我尝试使用下面描述的CUDA内核传递它时,我得到一个System.Exception:i64不是结构类型。我应该如何使用Alea CUDA内核在非托管内存中传递指向数组的指针 unsafe private static void CopyDataToDeviceMemory( IntPtr hData, deviceptr<float> dData, int dataLength)
IntPtr hData
,它指向存储在非托管内存中的数据数组的开头。当我尝试使用下面描述的CUDA内核传递它时,我得到一个System.Exception:i64不是结构类型
。我应该如何使用Alea CUDA内核在非托管内存中传递指向数组的指针
unsafe private static void CopyDataToDeviceMemory(
IntPtr hData,
deviceptr<float> dData,
int dataLength)
{
int start = blockIdx.x * blockDim.x + threadIdx.x;
int stride = gridDim.x * blockDim.x;
for (int i = start; i < dataLength; i += stride)
{
dData[i] = DeviceFunction.Convert<ushort, float>(
*((ushort*)(hData + i * 2)));
}
}
不安全的私有静态void CopyDataToDeviceMemory(
IntPtr hData,
deviceptr dData,
int数据长度)
{
int start=blockIdx.x*blockDim.x+threadIdx.x;
int stride=gridDim.x*blockDim.x;
对于(int i=开始;i<数据长度;i+=步幅)
{
dData[i]=DeviceFunction.Convert(
*((ushort*)(hData+i*2));
}
}
我不确定我是否完全理解了这个问题,但可能您正试图将IntPtr用作一个值,而不是指针。尝试将该值封送回来,并使用如下方式:var hDataValue=Marshal.ReadInt64(hData);然后使用hDataValue。我确实看到您正在使用ushort*并将其转换为*作为指针,但hData+1*2不是在指针上工作,而不是在值上工作吗?如果我错了,我道歉;“这里很晚了,”迈克尔·布克提伊说,“我正在做指针算术。”。因此hData
指向数组的开头,然后hData+1
应该指向下一个字节,依此类推。我试图将hData
指向的数组基本复制到dData
中。明白了,我现在明白了/hData位于哪里?我猜是在主机上,对吧?如果是这样,就不能在内核中直接使用它。您必须首先使用诸如Alea.CUDAInterop.cuMemcpyHtoD
之类的函数将hData传输到设备中。