首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相当于CUDA内核中的usleep()?

相当于CUDA内核中的usleep()?
EN

Stack Overflow用户
提问于 2012-06-27 06:59:09
回答 3查看 10.4K关注 0票数 11

我想在CUDA内核中调用类似于usleep()的东西。基本目标是让所有GPU内核休眠或忙碌等待几毫秒--这是我想为CUDA应用程序执行的一些健全性检查的一部分。我这样做的尝试如下:

代码语言:javascript
复制
#include <unistd.h>
#include <stdio.h>
#include <cuda.h>
#include <sys/time.h>

__global__ void gpu_uSleep(useconds_t wait_time_in_ms)
{
    usleep(wait_time_in_ms);
}

int main(void)
{
    //input parameters -- arbitrary
    //   TODO: set these exactly for full occupancy
    int m = 16;
    int n = 16;
    int block1D = 16;
    dim3 block(block1D, block1D);
    dim3 grid(m/block1D, n/block1D);

    useconds_t wait_time_in_ms = 1000;

    //execute the kernel
    gpu_uSleep<<< grid, block >>>(wait_time_in_ms);
    cudaDeviceSynchronize();

    return 0;
}

当我尝试使用NVCC编译它时,我得到了以下错误:

代码语言:javascript
复制
error: calling a host function("usleep") from a __device__/__global__ 
       function("gpu_uSleep") is not allowed

显然,我不允许在内核中使用诸如usleep()之类的主机函数。有什么好的替代方案呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-27 08:53:57

您可以使用读取clock()的循环忙于等待。

要等待至少10,000个时钟周期:

代码语言:javascript
复制
clock_t start = clock();
clock_t now;
for (;;) {
  now = clock();
  clock_t cycles = now > start ? now - start : now + (0xffffffff - start);
  if (cycles >= 10000) {
    break;
  }
}
// Stored "now" in global memory here to prevent the
// compiler from optimizing away the entire loop.
*global_now = now;

注意:这是未经测试的。处理溢出的代码是@Pedro从this answer借来的。有关clock()如何工作的详细信息,请参阅他的回答和CUDA编程指南4.2中的B.10节。还有一个clock64()命令。

票数 11
EN

Stack Overflow用户

发布于 2012-06-27 08:56:06

您可以在clock()或clock64()上旋转。CUDA SDK concurrentKernels示例执行以下操作:

代码语言:javascript
复制
__global__ void clock_block(clock_t *d_o, clock_t clock_count)
{
    clock_t start_clock = clock();
    clock_t clock_offset = 0;
    while (clock_offset < clock_count)
    {
        clock_offset = clock() - start_clock;
    }
     d_o[0] = clock_offset;
}

我推荐使用clock64()。cudaDeviceProperties()和clock64()是以周期为单位的,因此您必须使用clock()查询频率。频率可以是动态的,因此很难保证精确的自旋回路。

票数 22
EN

Stack Overflow用户

发布于 2021-01-28 20:36:48

对于CUDA的最新版本,以及具有计算能力7.0或更高版本的设备(伏特、图灵、安培等),您可以使用__nanosleep()原语:

代码语言:javascript
复制
void __nanosleep(unsigned ns);

这消除了在较早的答案中建议的忙碌睡眠的需要。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11217117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档