Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么我的CUDA内核看起来什么都不做呢?

为什么我的CUDA内核看起来什么都不做呢?
EN

Stack Overflow用户
提问于 2021-03-01 03:03:28
回答 1查看 454关注 0票数 0

我正在开发一个GTX泰坦X GPU,CUDA 8.0和驱动程序版本367.48的系统。当我使用nvidia-smi时,我的GPU是正确列出的。

我正在使用下面的代码来执行Pi的数值逼近,并测量代码的执行时间5000次。但是,内核返回0.0作为近似结果。为什么会发生这种情况?

代码语言:javascript
运行
AI代码解释
复制
#include "cuda_runtime.h"
#include <stdio.h>

#define ITERATIONS 96000000
const int threads = 256; 

// Synchronous error checking call. Enable with nvcc -DEBUG
inline void checkCUDAError(const char *fileName, const int line)
{ 
    #ifdef DEBUG 
        cudaThreadSynchronize();
        cudaError_t error = cudaGetLastError();
        if(error != cudaSuccess) 
        {
            printf("Error at %s: line %i: %s\n", fileName, line, cudaGetErrorString(error));
            exit(-1); 
        }
    #endif
}

__global__ void integrateSimple(float *sum)
{
    __shared__ float ssums[threads];

    // Each thread computes its own sum. 
    int global_idx = threadIdx.x + blockIdx.x * blockDim.x;
    if(global_idx < ITERATIONS)
    {
        float step = 1.0f / ITERATIONS;
        float x = (global_idx + 0.5f) * step;
        ssums[threadIdx.x] = 4.0f / (1.0f + x * x);
    }
    else
    {
        ssums[threadIdx.x] = 0.0f;
    }
    
    // The 1st thread will gather all sums from all other threads of this block into one
    __syncthreads();
    if(threadIdx.x == 0)
    {
        float local_sum = 0.0f;
        for(int i = 0; i < threads; ++i)
        {
            local_sum += ssums[i];
        }
        sum[blockIdx.x] = local_sum;
    }
}
int main()
{
    const float PI = 3.14159265358979323846264;
    int deviceCount = 0;

    printf("Starting...");
    
    cudaError_t error = cudaGetDeviceCount(&deviceCount);

    if (error != cudaSuccess)
    {
        printf("cudaGetDeviceCount returned %d\n-> %s\n", (int)error, cudaGetErrorString(error));
        return 1;
    }

    deviceCount == 0 ? printf("There are no available CUDA device(s)\n") : printf("%d CUDA Capable device(s) detected\n", deviceCount);

    /*--------- Simple Kernel ---------*/
    int blocks = (ITERATIONS + threads - 1) / threads;
    float *sum_d;
    float step = 1.0f / ITERATIONS;
    
    for (int i = 0; i < 5000; ++i)
    {
        // Allocate device memory
        cudaMallocManaged((void **)&sum_d, blocks * sizeof(float));

        // CUDA events needed to measure execution time
        cudaEvent_t start, stop;
        float gpuTime;

        // Start timer
        cudaEventCreate(&start);
        cudaEventCreate(&stop);
        cudaEventRecord(start, 0);

        /*printf("\nCalculating Pi using simple GPU kernel over %i intervals...\n", (int)ITERATIONS);*/

        integrateSimple<<<blocks, threads>>>(sum_d);
        cudaDeviceSynchronize(); // wait until the kernel execution is completed
        checkCUDAError(__FILE__, __LINE__);

        // Stop timer
        cudaEventRecord(stop, 0);
        cudaEventSynchronize(stop);
        cudaEventElapsedTime(&gpuTime, start, stop);
        
        // Sum result on host
        float piSimple = 0.0f;
        for (int i = 0; i < blocks; i++)
        {
            piSimple += sum_d[i];
        }
        
        piSimple *= step;

        cudaFree(sum_d);

        // Stop timer
        cudaEventRecord(stop, 0);
        cudaEventSynchronize(stop);
        cudaEventElapsedTime(&gpuTime, start, stop);
        // Print execution times
        /*printf("\n======================================\n\n");*/
        printf("%.23lf,%.23lf,%f", piSimple, fabs(piSimple - PI), gpuTime/1000);
        printf("\n");
    }
    // Reset Device
    cudaDeviceReset();
    return 0;
}

最后一行的输出

0.00000000000000000000000,3.14159274101257324218750,0.000009 0.00000000000000000000000,3.14159274101257324218750,0.000009 0.00000000000000000000000,3.14159274101257324218750,0.000009 0.00000000000000000000000,3.14159274101257324218750,0.000008 0.00000000000000000000000,3.14159274101257324218750,0.000008 0.00000000000000000000000,3.14159274101257324218750,0.000008

另外,当我编译得到这个警告时:

nvcc警告:“计算20”、“sm 20”和“sm_21”体系结构是>不推荐的,并可能在以后的版本中删除(使用-Wno-废弃-gpu-目标来抑制警告)。

EN

回答 1

Stack Overflow用户

发布于 2021-03-01 03:57:29

你的具体案例

这可能只是您实际上根本没有检查错误:当您没有使用#ifdef显式编译时,您的错误检查函数有它的代码-DDEBUG‘ed-away。

此外,正如@AnderBiguri建议的那样,确保您正在为正确的微体系结构( nvcc --gpucode/--gencode/--gpu-architecture开关)进行编译。

一般问题

当内核似乎产生0值的输出时,您应该:

确保你在检查错误

您应该使用CUDA现代-C++ API包装器 (警告:我是作者,所以我有偏见),在这里所有API调用后面都是检查是否成功;或者您应该在CUDA调用之后手动添加错误检查。注意:如果您已经编写了自己的错误处理代码,请确保它能够被触发并打印出来(例如,将cudaSuccess以外的内容传递给它)。

区分“输出零”和“什么都不做”

尝试用一个初始模式填充您的输出缓冲区,以查看是否有任何东西被写入它们(例如,从包含类似cudaMemcpy()0xDEADBEEF的缓冲区中写入的)。然后,通过检查输出,可以确定内核是否实际写入0值。如果它写0,那么你需要调试你的内核。否则..。

确保内核实际上已启动

如果您的内核没有向输出写入任何内容,那么:

  • 它没有被发射,或者
  • 在执行过程中有一些运行时错误,或者
  • 代码中有一个bug,它使线程完成执行,而不需要按照它们的指令将其写入共享内存:

第一个选项是最有可能的,实际上它与第二个选项大致相同,只是错误发生在启动之前。重复检查和三次检查错误处理代码。

然后,使用NSight计算或NSight系统分析器来查看内核是否实际启动和执行。如果是的话,那么它又回到了调试阶段。尝试使用精心放置的printf()指令或实际调试器工具。

如果在内核运行期间收到错误,您可能可以使用库达电脑消毒剂 (早期的CUDA版本中的库达)来捕获和识别它。

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

https://stackoverflow.com/questions/66420924

复制
相关文章
为什么我选择使用原型工具来代替纸原型
从毕业到现在的三年设计生涯中,对于设计我有自己的理解。从一开始的伟大梦想——通过我的设计改变世界,到现在的现实需求——设计得让人觉得有用,易用,好用。在大学的时候,导师会叫我们只用纸笔来做原型图,这样能更直观地看出我们的想法和信息架构。刚工作的时候,我也习惯只用纸笔来画原型图,这样能快速地表达我的想法。 纸笔原型毕竟使用的工具很简单,人人都有,只需要纸笔即可。纸原型关注的是流程而不是具体的细节,构建原型很快速,也并不用画的很精美只需要表达出界面的流程和关健信息。纸原型的好处就在于与他人沟通的时候可以进行
奔跑的小鹿
2018/03/16
8030
为什么我选择使用原型工具来代替纸原型
为什么我选择使用原型工具来代替纸原型
从毕业到现在的三年设计生涯中,对于设计我有自己的理解。从一开始的伟大梦想——通过我的设计改变世界,到现在的现实需求——设计得让人觉得有用,易用,好用。在大学的时候,导师会叫我们只用纸笔来做原型图,这样能更直观地看出我们的想法和信息架构。刚工作的时候,我也习惯只用纸笔来画原型图,这样能快速地表达我的想法。
奔跑的小鹿
2019/01/31
7220
为什么我选择使用原型工具来代替纸原型
为什么SQL优化中建议用UNION来代替OR
在SQL优化相关资料中,通常可以看到一个建议:用UNION来代替OR 举例 采用 OR 语句: SELECT * FROM a, b WHERE a.p = b.q or a.x = b.y; 采用 UNION 语句,返回的结果同上面的一样,但是速度要快些: SELECT * FROM a, b WHERE a.p = b.q UNION SELECT * FROM a, b WHERE a.x = b.y UNION 语句中明明是会执行两次查询操作,而 OR语句只有一次查询,OR语句反而
dys
2018/04/02
6.2K0
为什么SQL优化中建议用UNION来代替OR
电脑的 ip 是怎么来的呢?我又没有配置过
显然,这里有两种配置方式,一种是自动获取 ip 地址,一种是我们手动来设置,我相信大部分人都是通过自动获取的方式来得到 ip 的,那么问题来了,它是如何自动获得到的呢?
帅地
2019/06/06
1.3K0
电脑的 ip 是怎么来的呢?我又没有配置过
html是什么?如何正确使用html呢?
html的格式相信大家都经常见到过,但是对html的用途和使用估计有部分的朋友会不了解,html常用于程序编程,静态网页,网页链接等作为标记符号使用,那么具体的html是什么?如何正确使用html呢?对此问题,接下来就为大家做出简单易懂的介绍,想要了解的朋友就过来了解一下吧。
用户8715145
2021/06/17
2.1K0
CPS推广:为什么我的佣金还没有到账呢
CPS推广奖励的佣金,目前无法直接后台提现,需要在次月月结之后,由财务系统统一打款到银行,即推广者后台所填写的银行账号,一般上月佣金,次月月末到账,具体时间以银行到账为准。
腾讯云-推广奖励
2019/11/28
10.8K0
CPS推广:为什么我的佣金还没有到账呢
copykat为什么没有infercnv直观呢
其实 copykat 仅仅是算法判别的时候不如人意,但是可视化的时候仍然是肉眼可以明显区分二倍体正常细胞和非整倍体的癌症细胞,所以我们想看看具体做什么改进,可以绕过这个bug,首选项我们把全部的上皮细胞按照病人进行了拆分,得到如下所示 的每个病人独立的文件夹以及每个文件夹下面的expFile.txt !
生信技能树jimmy
2021/12/04
2.2K0
copykat为什么没有infercnv直观呢
unicloud进阶uni-id入门(一)---uni-id能做什么?
这个专栏就带大家使用uni-id 由于要写毕设和论文 所以会更新很慢 如果你对云开发感兴趣 可以加入交流群 974178910 535620886
代码哈士奇
2021/10/25
7640
unicloud进阶uni-id入门(一)---uni-id能做什么?
为何cytoscape总是说我没有java呢
因为最近自己购置了一个全新的Windows电脑,所以就系统性的配置了全部的生物信息学相关软件,当然是也包括cytoscape啦。但是遇到了报错,如下:
生信技能树
2020/07/30
2.3K0
为何cytoscape总是说我没有java呢
为什么 MyBatis 源码中,没有我那种 if···else
在MyBatis的两万多行的框架源码中,使用了大量的设计模式对工程架构中的复杂场景进行解耦,这些设计模式的巧妙使用是整个框架的精华。
搜云库技术团队
2023/10/21
2210
为什么 MyBatis 源码中,没有我那种 if···else
为什么 MyBatis 源码中,没有我那种 if···else
在MyBatis的两万多行的框架源码中,使用了大量的设计模式对工程架构中的复杂场景进行解耦,这些设计模式的巧妙使用是整个框架的精华。
一行Java
2023/09/19
2500
为什么 MyBatis 源码中,没有我那种 if···else
HTML中id、name、class 区别
id的用途  1) id是HTML元素的Identity,主要是在客户端脚本里用。
阳光岛主
2019/02/19
2.6K0
hdp 不更新了,有没有办法将 Apache Hadoop 代替 hdp 并集成到 Ambari 中呢?
今天咱来聊一聊 Ambari 如何集成 Apache Hadoop 哈,自从 cloudera 公司将 hortonworks 公司收购后,hdp 就不迭代更新了,这对 Apache Ambari 也产生了很大影响,毕竟 Ambari 与 hdp 耦合性很强。
create17
2022/11/17
3.5K1
使用LocalDateTime来代替Date
在我们使用Date的时候,会发现很多无法理解的返回值,而且有很多方法是已经被弃用了的
挨踢小子部落阁
2020/01/02
1.6K0
Postgre中FDW能做什么?
什么是FDW? FDW是外部数据包装器,早在2003年SQL标准中添加一个访问远程数据的规范,这个称为SQL外部数据管理。PostgreSQL从9.1版本已经开发出了FDW.在PostgreSQL中配
用户4700054
2022/08/17
1.6K0
Postgre中FDW能做什么?
selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘
pycharm新建了一个项目,用于做web自动化测试,直接安装了selenium这个库,发现之前写的Selenium元素定位的代码运行之后会报错,发现是Selenium更新到新版本(4.x版本)后,以前的一些常用的代码的语法发生了改变,当然如果没有更新过或是下载最新版本的Selenium是不受到影响的,还可以使用以前的写法。接下来就是讨论有关于新版本后Selenium定位元素代码的新语法,大家后面别再踩这个坑了。
霍格沃兹测试开发Muller老师
2022/12/01
5.2K0
python中利用try..except来代替if..else
在有些情况下,利用try…except来捕捉异常可以起到代替if…else的作用。 比如在判断一个链表是否存在环的leetcode题目中,初始代码是这样的
用户7886150
2020/12/20
5630
为什么不用Preact或者Fast-React来代替React ?
戳蓝字“IMWeb前端社区”关注我们哦! 1写在前面 生命在于折腾,Coder的折腾就在于造各种轮子。 React在前端圈大火之后,轮子层出不穷。而其中的一些轮子,由于专注于解决很多人诟病的React过大、过慢的问题(然而不并不觉得),也相当出名。关注最多的莫过于Preact、Inferno等以「轻量化」为特色的库了,Github Star数也超过10000。另外由于React广泛应用于同构应用上,并且 rendertoString,renderToStaticMarkup 也存在同步执行、速度慢等问题,一
用户1097444
2022/06/29
3940
为什么不用Preact或者Fast-React来代替React ?
为什么AlertDialog要使用Builder来构建呢
首先说句废话,因为 AlertDialog 太过复杂,内部参数太多,然后不使用构建者模式那么 AlertDialog 的构造方法就可能是:
开发者
2019/12/26
5330
文章是原创的,为什么网站没有收录呢?
刚进入seo领域就知道原创文章对于网站的收录、展现量、权重等的影响,所以保证网站内容的原创度是seoer的基本功,但往往你的内容是原创的,但网站迟迟没有收录,让很多seoer感到迷茫,其实问题不一定只出现在文章上,你还应做以下分析:
蝙蝠侠IT
2021/05/19
6560
文章是原创的,为什么网站没有收录呢?

相似问题

在派生类C++中访问受保护成员

10

如何延迟C++基类中成员的初始化,直到执行派生类的ctor?

20

派生类中基类委托ctor的c++使用

10

访问派生类中类的受保护成员

24

C++:无法从派生类访问受保护成员

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档