2013-02-21 24 views
0

是否可以动态确定每个块的最大线程数?即向GPU请求该值并将其存储在变量中的功能。谢谢你的帮助。在CUDA中动态确定最大线程数?


谢谢,我决定线程用下面的代码的最大数量:

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>>>(); 

这种形式是否正确地调用内核?

Thansk为您提供帮助。


好的,我使用的Nvidia的总和减少内核号码6,和所使用的样本代码,其中确定线程和块与下一个代码:

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

该代码可以使用我的阵列。

回答

1

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

+0

但是,我们不能保证给定的内核将在'maxThreadsPerBlock'中返回的结果启动,我假设这个问题隐含地想知道的。 – talonmies 2013-02-21 21:55:26

+1

是的。我自己并没有明白这一点。例如,“内核”这个词不会出现在问题的任何地方。而'cudaGetDeviceProperties' *就是*“向GPU请求价值并将其存储在变量中的函数”,正是如此。但是,当然你是正确的,假设这些参数在'maxThreadsPerBlock'和其他相关参数中定义的限制内,并且假设没有其他外部的内核抑制器,内核将会正确启动启动参数中指定的线程数发射。 – 2013-02-21 22:03:39

3

您可以使用驱动程序API来访问特定内核的属性(称为驱动程序API术语中的函数)。

使用API​​调用cuFuncGetAttribute,其中CUfunction_attribute的值等于CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK。

这给了你:

每个块的线程,最大数量超过该推出的功能将失败。该数字取决于函数当前加载的功能和设备。

0

你需要的是cudaFuncGetAttributes如果您使用CUDA运行时API或cuFuncGetAttribute与CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK为RoBiK在他的回答中指出,如果你正在使用CUDA驱动程序API。这两个函数都记录在相应的API文档的执行控制部分。