Cudafy 线程已退出,代码为 259

Posted

技术标签:

【中文标题】Cudafy 线程已退出,代码为 259【英文标题】:Cudafy The thread has exited with code 259 【发布时间】:2016-08-03 08:17:40 【问题描述】:

我已经用 cudafy 测试了一些 GPU 计算样本

我有计算/creta 收集数据的代码,并且我想对收集中的每个对象执行一些 GPU 操作的每个循环 代码:

public override void CountData(List<IData<int>> datas)

        for (int i = 0; i < datas.Count; i++)
        
           Execute(datas[i]);
                  

public static void Execute(IData<int> data)

        CudafyModule km = CudafyTranslator.Cudafy();

        GPGPU gpu = CudafyHost.GetDevice(CudafyModes.Target, CudafyModes.DeviceId);
        gpu.LoadModule(km);

        int c;
        int[] dev_c = gpu.Allocate<int>(); // cudaMalloc one Int32
        gpu.Launch().add(data.IntData[0], data.IntData[1], dev_c); // or gpu.Launch(1, 1, "add", 2, 7, dev_c);
        gpu.CopyFromDevice(dev_c, out c);


        Console.WriteLine(c + ";");

        gpu.Free(dev_c);
        chromozome.Result= c;


[Cudafy]
public static void add(int a, int b, int[] c)

        c[0] = a + b;

此代码适用于第一次调用 CountData,但在 Count 数据循环结束后程序会卡住并且控制台输出显示

线程 0xf50 已退出,代码为 259 (0x103)。 线程 0x10c 已退出,代码为 259 (0x103)。 线程 0xc30 已退出,代码为 259 (0x103)。 线程 0xcc0 以代码 0 (0x0) 退出。 线程 0x548 已退出,代码为 0 (0x0)。

有没有人知道问题出在哪里?我尝试 gpu.Synchronize, CudafyHost.ClearDevices() ,但它总是以这个错误结束 感谢您的帮助

编辑:经过一些测试我发现

gpu.Launch().add(5, 3, dev_c);

有效但:

 gpu.Launch().add(data.IntData[0], data.IntData[1], dev_c);

不是

【问题讨论】:

这是 VS2013 附带的调试器中的一个错误。当您看到 259 时,您可以放心地假定线程以退出代码 0 正常结束。从“调试”>“Windows”>“线程”窗口开始调试死锁,以确保您正在查看正确的线程。确保您启用了非托管调试。调用堆栈窗口内容至关重要,必须张贴在问题中才能获得帮助。 啊,好吧,我担心其他地方有问题。当我发现这不是主要问题时,我成功地在代码的另一部分发现了问题。 【参考方案1】:

感谢 Hans Passant,他认为这根本不是问题,gpu 卡应该可以解决问题。我在代码的其他部分发现错误。所以上面的代码可以正常工作。

【讨论】:

以上是关于Cudafy 线程已退出,代码为 259的主要内容,如果未能解决你的问题,请参考以下文章

M2Mqtt 库未发布消息,线程以代码 259 退出

SDL 事件调试问题

代码卡在 BackgroundWorker

如何退出所有正在运行的线程?

线程应当如何正常退出?

MFC 对话框应用程序未关闭