在CUDA中动态确定最大线程数?

在CUDA中动态确定最大线程数?,cuda,Cuda,是否可以动态确定每个块的最大线程数?i、 e.向GPU请求值并将其存储在变量中的函数。谢谢你的帮助 谢谢,我使用以下代码确定了最大线程数: int dev = 0; cudaDeviceProp deviceProp; cudaGetDeviceProperties(&deviceProp, dev); unsigned int maxThreads = deviceProp.maxThreadsPerBlock; 根据这个数字,我用以下行计算内核的块和线程: unsigned i

是否可以动态确定每个块的最大线程数?i、 e.向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>>>();
unsigned int blocksNum=1+((mSize-1)/maxThreads);//mSize是数组的大小
无符号int-threadsNum=1+((mSize-1)/blocksNum);
dim3 dimGrid(块SNUM,1,1);
dim3 dimBlock(螺纹螺母,1,1);
...
内核();
这种形式调用内核正确吗

谢谢你的帮助


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

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

此代码适用于我的数组。

是的,值()是返回的属性之一。对于一个完整的示例,请查看

是,值()是返回的属性之一。对于一个完整的示例,请查看

查询设备属性,查看。

查询设备属性,查看。

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

使用值等于CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK的API调用

这将为您提供:

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


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

使用值等于CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK的API调用

这将为您提供:

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


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

如果您使用的是CUDA运行时API或CUFUNCGETTribute具有CU_FUNC_属性的CUFUNCGETTribute,则需要CUDAFUNCGETTributes,如果您使用的是CUDA驱动程序API,则RoBiK在回答中指出了这一点。这两个函数都记录在各自API文档的执行控制部分。

但是不能保证给定的内核启动时会返回
maxThreadsPerBlock
中返回的结果,我假设这就是问题隐含想要知道的。True。我自己也没有忘记这一点。例如,“内核”一词没有出现在问题的任何地方。而
cudagetDeviceProperty
正是“向GPU请求值并将其存储在变量中的函数”。但是您当然是正确的,内核将以启动参数中指定的线程数启动,假设这些参数在
maxThreadsPerBlock
和其他相关参数中定义的限制范围内,并且假设内核启动没有其他无关的抑制因素。但是不能保证给定的内核启动时会返回
maxThreadsPerBlock
中返回的结果,我假设这就是问题隐含想要知道的。True。我自己也没有忘记这一点。例如,“内核”一词没有出现在问题的任何地方。而
cudagetDeviceProperty
正是“向GPU请求值并将其存储在变量中的函数”。但您当然是正确的,内核将以启动参数中指定的线程数启动,假设这些参数在
maxThreadsPerBlock
和其他相关参数中定义的限制范围内,并且假设内核启动没有其他无关的限制。