C# TotalMemory显示出极其巨大的价值

C# TotalMemory显示出极其巨大的价值,c#,cudafy.net,C#,Cudafy.net,我有一张4GB和一张12GB的带有CUDA的gfx卡。在我的应用程序中,我使用CUDAfy.NET,当调用GPGPU.TotalMemory属性时,它显示了一个非常大的值(绝对不正确)。与freemory相同。如何解决这个问题 Console.WriteLine("GPU total memory: " + gpu.TotalMemory.ToString()); Console.WriteLine("GPU free memory: " + gpu.FreeMemory.ToString())

我有一张4GB和一张12GB的带有CUDA的gfx卡。在我的应用程序中,我使用CUDAfy.NET,当调用
GPGPU.TotalMemory
属性时,它显示了一个非常大的值(绝对不正确)。与
freemory
相同。如何解决这个问题

Console.WriteLine("GPU total memory: " + gpu.TotalMemory.ToString());
Console.WriteLine("GPU free memory: " + gpu.FreeMemory.ToString());

对于4GB卡,TotalMemory显示18446744072635809792字节,FreeMemory显示18446744072628600832字节。

正如Talonmes指出的,这一定是CUDAfy中的一个错误,导致了错误的内存计算,但我找到了另一种方法来获取信息。CudafyByExample中的一些示例代码正展示了如何做到这一点! 因此,我必须通过调用
CudafyHost.GetDeviceProperties()
函数来获取包含每个设备属性的对象列表,而不是读取GPGPU类的属性
gpu.TotalMemory
,然后每个对象将包含每个CUDA图形卡的所需信息:

public static void PrintGpuProperties() // this was copied from CudafyByExample
{
    int i = 0;

    foreach (GPGPUProperties devicePropsContainer in CudafyHost.GetDeviceProperties(CudafyModes.Target, false))
    {
        Console.WriteLine("   --- General Information for device {0} ---", i);
        Console.WriteLine("Name:  {0}", devicePropsContainer.Name);
        Console.WriteLine("Platform Name:  {0}", devicePropsContainer.PlatformName);
        Console.WriteLine("Device Id:  {0}", devicePropsContainer.DeviceId);
        Console.WriteLine("Compute capability:  {0}.{1}", devicePropsContainer.Capability.Major, devicePropsContainer.Capability.Minor);
        Console.WriteLine("Clock rate: {0}", devicePropsContainer.ClockRate);
        Console.WriteLine("Simulated: {0}", devicePropsContainer.IsSimulated);
        Console.WriteLine();

        Console.WriteLine("   --- Memory Information for device {0} ---", i);
        Console.WriteLine("Total global mem:  {0}", devicePropsContainer.TotalMemory);
        Console.WriteLine("Total constant Mem:  {0}", devicePropsContainer.TotalConstantMemory);
        Console.WriteLine("Max mem pitch:  {0}", devicePropsContainer.MemoryPitch);
        Console.WriteLine("Texture Alignment:  {0}", devicePropsContainer.TextureAlignment);
        Console.WriteLine();

        Console.WriteLine("   --- MP Information for device {0} ---", i);
        Console.WriteLine("Shared mem per mp: {0}", devicePropsContainer.SharedMemoryPerBlock);
        Console.WriteLine("Registers per mp:  {0}", devicePropsContainer.RegistersPerBlock);
        Console.WriteLine("Threads in warp:  {0}", devicePropsContainer.WarpSize);
        Console.WriteLine("Max threads per block:  {0}", devicePropsContainer.MaxThreadsPerBlock);
        Console.WriteLine("Max thread dimensions:  ({0}, {1}, {2})", devicePropsContainer.MaxThreadsSize.x, devicePropsContainer.MaxThreadsSize.y, devicePropsContainer.MaxThreadsSize.z);
        Console.WriteLine("Max grid dimensions:  ({0}, {1}, {2})", devicePropsContainer.MaxGridSize.x, devicePropsContainer.MaxGridSize.y, devicePropsContainer.MaxGridSize.z);

        Console.WriteLine();

        i++;
    }
}

这看起来像某种32位整数溢出错误。您可能应该联系开发人员让他们知道这一点。好的,我已经使用了中的代码(但是必须使用
ulong
变量而不是
int
),它现在显示了正确的内存大小。但是我仍然会尝试使用正确的CUDAfy函数。剪切64位整数的上半部分也不会给出正确的值。十进制的C0000000为3GB,当前卡为4GB(由源代码正确显示)