【问题标题】:Running parallel CUDA tasks运行并行 CUDA 任务
【发布时间】:2012-09-06 07:28:10
【问题描述】:

我即将使用 CUDA 技术创建支持 GPU 的程序。它应该是 C# Emgu 或 C++ Cuda 工具包(尚未确定)。

我需要使用所有 GPU 功能(我有 16 个 GPU 核心的卡)。如何并行运行 16 个任务?

【问题讨论】:

    标签: cuda gpu


    【解决方案1】:

    首先。在 6xx 系列之前,16 个 GPU 内核等于 16*8=128 个内核。在 6xx 系列上,它是 16*32=512 个内核。这并不意味着您应该将自己限制为 128/512 个任务。

    第二:emgu 似乎是 .NET 的 OpenCV 包装器,与图像处理有关。它通常与 GPU 编程无关。可能是某些算法已被 gpu 加速,但我对此一无所知。在这方面 CUDA 的替代品是 OpenCL,而不是 OpenCV。如果您将像您说的那样使用 CUDA 技术,那么您别无选择 CUDA,因为只有 CUDA 才是 CUDA。

    在启动任务时,您只需告诉 GPU 您希望运行多少线程。实际上,您告诉 GPU 有多少块,以及多少线程 pr。阻止你想运行。这是在您调用 cuda 函数本身时完成的。您也不想将自己限制为 128/512 线程,而是进行实验。

    不知道您对 GPGPU 编程的了解,但请记住,您不能像在 CPU 上那样运行任务。您不能运行 128 个不同的任务,所有线程都必须运行完全相同的指令(分支时除外,通常应避免)。

    【讨论】:

    • 一点澄清:我的意思是 OpenCV,而不是 OpenCL,因为我的主要领域确实是图像处理(考虑 Emgu 的原因相同)。对于您其余的回复 - 非常感谢!
    • 好的。然后说你想要它加速 CUDA 有点令人困惑。 CUDA 非常适合这种处理,但我的猜测是 OpenCV,如果它是 GPU 加速的,则使用 OpenCL,因为这是跨供应商。
    【解决方案2】:

    一般来说,您需要足够的线程来填充所有流式多处理器。至少是.25 * MULTIPROCESSORS * MAX_THREADS_PER_MULTIPROCESSOR

    现在特别是在 CUDA 中,假设您有一些 CUDA 内核 __global__ void square_array(float *a, int N)...

    现在,当您启动内核时,您可以指定块数和每个块的线程数

    square_array <<< n_blocks, n_threads_per_block >>> (a, N);
    

    注意:您需要更加熟悉 CUDA 并行编程模型,因为您不会在一个会消耗您所有 GPU 能力的庄园中接近。考虑阅读Programming Massively Parallel Processors, A Hands-on Approach

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 2020-06-21
    • 1970-01-01
    • 2020-01-02
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多