gpt4 book ai didi

C#方法等同于Java的DirectByteBuffer

转载 作者:行者123 更新时间:2023-11-28 00:43:12 24 4
gpt4 key购买 nike

我正在学习如何在 C# 中使用 C++ DLL,并制作了一个 C++ 函数来乘以两个已分配(编码)的变量集。在我将分配的组合大小从 512MB 增加到 1024 之前,在 C# 和 C++ 中一切都运行良好。然后 visual C# 给出了“protected memory access violation”的错误。其来源是用 float 填充缓冲区的 dll 函数。限制必须介于 512MB 和 1024MB 之间。 Marshal.alloc 仅接受 int 大小的缓冲区长度,因此每次分配实际上有 2GB 的限制,但是当我尝试使用更小的 block 来超过限制时,会出现相同的错误。

问题:是否有任何在 C# 中没有上限/限制的 directbytebuffer 等价物?还是我在做一些简单的指针错误?

dll 和主项目都是 64 位目标的,可以使用普通数组超过 5-6 GB 的内存。

这是写入缓冲区的 c++ 函数:

__declspec(dllexport) void floatOne(long av, int n)
{
float * vektor1=(float *)av;
_mm256_zeroall();
__m256 r0=_mm256_setr_ps(1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f,1.0f);

for(int i=0;i<n;i+=8)
{

_mm256_store_ps(vektor1+i, r0);

}
_mm256_zeroall();
return;
}

这是它在 C# 中的用法:

public void one()
{
floatOne(bufferAdr.ToInt64() + offset, N);
// offset here is the properly aligned address to start usage
// N is private variable of vektor class (vector length)
}

分配是这样的:

 public vektor(int n /* number of elements*/, int a /* alignmentı*/)
{
N = n;
bufferAdr = Marshal.AllocHGlobal(4*n + 4*a);
//a-1 was enough but I put a*4 to be sure it doesnt overflow.
offset = (a - bufferAdr.ToInt64() % a);
}

这里是导入的DLL:

[DllImport("cpuKullanim.dll", EntryPoint = "floatOne")]
public static extern void floatOne(long adres1, int n);

已测试 RAM 是否存在任何硬件错误,但通过了内存测试,因此一定是软件问题。

谢谢。

两个项目的 windows7-64 位,cpu 64 位,目标机器 64 位。

最佳答案

  __declspec(dllexport) void floatOne(long av, int n)

这是您代码中的一个严重错误,long 类型在使用 MSVC 编译时在 64 位模式下为 32 位。这不够大,无法存储指针。在您开始分配更大的内存块之前,它会意外地工作。 “av”的正确参数类型是指针类型,至少是 void*。当然,没有理由避免将其声明为 float*。如果您不试图愚弄编译器,代码总是能更好地工作。您必须在 C# 代码中将其声明为 IntPtr。

你试图用对齐做的事情是非常难以理解的。要求是地址与 SSE2 代码的 16 的倍数对齐。你可以使用这个辅助方法:

    static IntPtr AlignAddressForSSE2(IntPtr addr) {
return new IntPtr((addr.ToInt64() + 15) & unchecked((long)0xfffffffffffffff0L));
}

同时将 15 添加到 Marshal.AllocHGlobal() 参数(实际上 8 就足够了)。或者简单地从您的 DLL 中导出两个函数,使用 _aligned_malloc() 和 _aligned_free() 处理此问题。

关于C#方法等同于Java的DirectByteBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17767048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com