【问题标题】:Simple way to make GPU to do calculation [closed]使GPU进行计算的简单方法[关闭]
【发布时间】:2013-12-27 20:45:47
【问题描述】:

这是我删除图像红色通道的代码。 有什么办法可以在 GPU 上实现吗?

其实我想要的是, 我有一个源位图数据(指针)和一个目标位图数据(指针)。 我想对 SOURCE BITMAP 进行一些计算,并将结果放到 DESTINATION BITMAP 中。

这段代码工作得很好,但我正在处理大图像。这就是为什么我希望 GPU 进行计算但我不想使用 CUDA 或 ATI 的 SDK。因为如果我使用 CUDA 或 ATI 的 SDK,我将需要这个图形卡。这就是为什么我需要适用于所有图形卡的东西。我尝试使用 DirectX,但没有看到类似的计算...

有没有库可以让 GPU 做到这一点?

 private unsafe void testX()
    {
        Bitmap sourceBmp = (Bitmap)System.Drawing.Bitmap.FromFile(@"C:\cc.jpg");
        BitmapData sourceBmd = sourceBmp.LockBits(new System.Drawing.Rectangle(0, 0, sourceBmp.Width, sourceBmp.Height), ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
        IntPtr sourcePtr = sourceBmd.Scan0;
        uint* pSource = (uint*)sourcePtr.ToPointer();

        Bitmap destinationBmp = new Bitmap(sourceBmp.Width, sourceBmp.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
        BitmapData destinationBmd = destinationBmp.LockBits(new System.Drawing.Rectangle(0, 0, sourceBmp.Width, sourceBmp.Height), ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
        IntPtr destinationPtr = destinationBmd.Scan0;
        uint* pDest = (uint*)destinationPtr.ToPointer();

        int _w = sourceBmp.Width;
        int _h = sourceBmp.Height;

        for (int j = 0; j < _h; j++)
        {
            for (int i = 0; i < _w; i++)
            {
                *pDest = (*pSource) & 0xff00ffff;
                pDest++;
                pSource++;
            }
        }

        sourceBmp.UnlockBits(sourceBmd);
        destinationBmp.UnlockBits(destinationBmd);
        if (File.Exists(@"C:\deneme2.jpg"))
            File.Delete(@"C:\deneme2.jpg");
        destinationBmp.Save(@"C:\deneme2.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
        MessageBox.Show("Done!");
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        testX();
    }

最后,我尝试了太多东西,例如 CUDA、OpenGL、OpenCL 和 ATI 的 SDK,我需要下载至少 300MB 的文件才能使用这些 SDK。所以,我需要的是一个适用于所有显卡的小型库或头文件。感谢您的帮助和回答。

顺便说一句,对不起我的英语。

谢谢。

【问题讨论】:

  • 如果您不想使用 CUDA,为什么要将它发布到 CUDA 标签? GPGPU 标签会更合适。您可以考虑使用 OpenCL,它可以帮助您在 CUDA 和非 CUDA 卡上运行代码(一旦编写)。我投票关闭这个非问题的帖子。下次尝试使用与您在下面写的帖子相关的标题。 StackOverflow 是一个社区。发布问题,您将获得他人的帮助。如果与您的问题相似,适当的标题可能会帮助其他用户找到解决他们自己问题的方法。
  • 如果你要求一个库来做它会产生一个悖论,但不想要“CUDA或其他东西”,因为“库”是集合的一个元素“别的东西”。

标签: c# c++ bitmap gpu gpgpu


【解决方案1】:

不,GPU 没有任何库,您可以随时根据需要编写一个。

【讨论】:

    【解决方案2】:

    GPGPU 编程的标准可移植方法是 OpenCL。它适用于所有 GPU。 对于英特尔处理器,它适用于从 IvyBridge 开始的集成 GPU。在 SandyBridge 上,CPU 实际完成了这项工作。 图形驱动程序附带 OpenCL 支持。

    编辑 对于 Windows,您可以尝试C++ AMP

    【讨论】:

    • 但他不想使用 CUDA 或其他东西
    【解决方案3】:

    我认为,使用 GPU 进行如此微不足道的操作,您不会看到任何性能优势。您需要将源图像数据复制到设备内存,执行处理并将结果图像数据复制回主机,这都需要一些时间。

    您可以重写代码,考虑 Stride(位图行的长度对齐到 4 个字节)。帮助编译器理解你在做什么。更喜欢数组索引而不是循环中的指针递增。

    int _ss = sourceBmd.Stride; // correct length of a row
    int _sd = destinationBmd.Stride;
    
    for (int j = 0; j < _h; j++)
    {
        for (int i = 0; i < _w; i++)
        {
            // each iteration of the internal for loop is now independent
            pDest[i] = pSource[i] & 0xff00ffff;
        }
        pDest+=_sd;
        pSource+=_ss;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-21
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 2011-05-16
      • 2012-06-23
      • 1970-01-01
      相关资源
      最近更新 更多