【问题标题】:Determine Max Threads dynamically in CUDA?在 CUDA 中动态确定最大线程数?
【发布时间】:2023-03-07 16:10:01
【问题描述】:

可以动态确定每个块的最大线程数吗?即向 GPU 询问值并将其存储在变量中的函数。感谢您的帮助。


谢谢,我用以下代码确定了最大线程数:

int dev = 0;
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, dev);

unsigned int maxThreads = deviceProp.maxThreadsPerBlock;

我用这个数字为我的内核计算块和线程:

unsigned int blocksNum = 1+((mSize-1)/maxThreads); // mSize is the size of array
unsigned int threadsNum = 1+((mSize-1)/blocksNum);
dim3 dimGrid(blocksNum, 1, 1);
dim3 dimBlock(threadsNum, 1, 1);
...
kernel<<<dimGrid,dimBlock>>>();

这种形式调用内核正确吗?

感谢您的帮助。


好的,我使用的是 Nvidia 的 6 号求和内核,并使用了示例代码,它用下一个代码确定线程和块:

unsigned int threadsNum = (mSize < maxThreads*2) ? nextPow2((mSize + 1)/ 2) : maxThreads;
unsigned int blocksNum = (mSize + (threadsNum * 2 - 1)) / (threadsNum * 2);

此代码适用于我的数组。

【问题讨论】:

    标签: cuda


    【解决方案1】:

    您可以使用 Driver API 来访问特定内核的属性(在 Driver API 术语中称为 Function)。

    使用 API 调用 cuFuncGetAttribute CUfunction_attribute 值等于 CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK。

    这给了你:

    每个块的最大线程数,超过该线程启动函数将失败。这个数字取决于函数和当前加载函数的设备。

    【讨论】:

      【解决方案2】:

      查询设备属性,查看maxThreadsPerBlock

      【讨论】:

        【解决方案3】:

        是的,值 (maxThreadsPerBlock) 是 cudaGetDeviceProperties 返回的属性之一。有关完整示例,请查看deviceQuery sample

        【讨论】:

        • 但是不能保证给定内核将启动并返回maxThreadsPerBlock 中的结果,我认为这是问题隐含地想知道的。
        • 是的。我自己并没有解决这个问题。例如,“内核”一词不会出现在问题的任何地方。而cudaGetDeviceProperties “一个向GPU询问值并将其存储在变量中的函数”,准确地说。但是当然你是对的,假设这些参数在maxThreadsPerBlock 和其他相关参数中定义的限制范围内,并且假设没有其他无关的对内核的抑制,内核将完全按照启动参数中指定的线程数启动发射。
        【解决方案4】:

        如果您使用的是 CUDA 运行时 API,您需要的是 cudaFuncGetAttributes;如果您使用的是 CUDA 驱动程序 API,您需要的是 cuFuncGetAttribute 和 CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK,正如 RoBiK 在他的回答中指出的那样。这两个函数都记录在各自 API 文档的执行控制部分。

        【讨论】:

          猜你喜欢
          • 2011-07-01
          • 2012-08-08
          • 2018-01-23
          • 2012-08-18
          • 2013-03-31
          • 2013-04-17
          • 2015-06-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多