在CUDA中动态确定最大线程数?
是否可以动态确定每个块的最大线程数?i、 e.向GPU请求值并将其存储在变量中的函数。谢谢你的帮助在CUDA中动态确定最大线程数?,cuda,Cuda,是否可以动态确定每个块的最大线程数?i、 e.向GPU请求值并将其存储在变量中的函数。谢谢你的帮助 谢谢,我使用以下代码确定了最大线程数: int dev = 0; cudaDeviceProp deviceProp; cudaGetDeviceProperties(&deviceProp, dev); unsigned int maxThreads = deviceProp.maxThreadsPerBlock; 根据这个数字,我用以下行计算内核的块和线程: unsigned i
谢谢,我使用以下代码确定了最大线程数:
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
和其他相关参数中定义的限制范围内,并且假设内核启动没有其他无关的限制。