前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >开发成长之路(14)-- 小项目:视频点播器服务端(放码过来)

开发成长之路(14)-- 小项目:视频点播器服务端(放码过来)

作者头像
看、未来
发布于 2021-09-18 03:02:07
发布于 2021-09-18 03:02:07
49900
代码可运行
举报
运行总次数:0
代码可运行

文章目录

系列教程一览

开发成长之路(1)-- C语言从入门到开发(入门篇一)

开发成长之路(2)-- C语言从入门到开发(函数与定制输入输出控制函数)

开发成长之路(3)-- C语言从入门到开发(讲明白指针和引用,链表很难吗?)

开发成长之路(4)-- C语言从入门到开发(距离开发,还差这一篇)

开发成长之路(5)-- C语言从入门到开发(仿ATM机项目,我写的第一个项目)

开发成长之路(6)-- C++从入门到开发(C++入门不难)

开发成长之路(6)-- C++从入门到开发(C++知名库:STL入门·容器(一))

开发成长之路(7)-- C++从入门到开发(C++知名库:STL入门·容器(二))

开发成长之路(8)-- C++从入门到开发(C++知名库:STL入门·容器(三))

开发成长之路(9)-- C++从入门到开发(C++知名库:STL入门·空间配置器)

开发成长之路(10)-- C++从入门到开发(C++知名库:STL入门·算法)

开发成长之路(11)-- STL常用函数大集合

开发成长之路(12)-- Linux网络服务端编程(通识篇之熟悉操作环境)

开发成长之路(13)-- Linux网络服务端编程(通识篇)


“看,未来”的个人简介

朋友们大家好,我是“看,未来”,最近跟CSDN头部大佬们学了这一招,听说挺受用的,我也来试试。

本系列主要面向想要走开发路线,又不知从何学起的大学生。

我本人也是在大一的时候就去参加了培训,后来又自学了一段时间,在这期间,我觉得更重要的是跟行业内的前辈们请教,这比培训来的实在多了。

网页右侧有我的个人微信二维码,如果对学习有困惑的小伙伴可以扫我,知无不言,言无不尽,欢迎来聊。


项目需求分析

我先简单的放一张架构图吧

这次这个小项目分为 前置服务器、后置服务器、进程间通信、数据库通信、性能检测、日志六个模块。

前置服务器:

使用epoll+socket模式,实现大量并发连接的快速处理。并接收通讯数据包,判断是否该传入后置服务器(心跳包就地抛弃)

进程间通信:

shm共享内存

后置服务器:

线程池处理业务、解压包模块内置、数据库连接查询、数据包协议

数据库通信:

sqlite3、MySQL选一个

性能检测:

单用户单业务、单用户多业务、多用户单业务、多用户多业务。

日志:

记录运行过程的日常日志、记录故障的故障日志。

业务分类:

连接、登录、注册、查询视频、查询历史记录、请求播放、退出连接

时间安排:20天周期。三天需求分析、三天demo测试、八天代码编写、四天联调、两天优化代码与文档撰写。


放码过来

很长的啊,我稍微放几个比较重要的出来。

有需要参照的小伙伴可以扫右侧我的微信找我拿,没思路也可以找我聊。

线程池.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "e_pthread_pool.h"

E_PThread_Pool::E_PThread_Pool(unsigned int max,unsigned int min,unsigned int wait)
{
    //配置基本参数
    count = 0;
    waitcount = 0;
    mincount = min;
    maxcount = max;
    waitsec = wait;
    Stop = false;

    //上锁,创建一定数量的线程作为初始线程池
    cond.lock();
        for (unsigned i = 0; i < mincount; i++)
        {
            createThread();
        }
    cond.unlock();
}

E_PThread_Pool::~E_PThread_Pool()
{
    destroyThread();
}

void E_PThread_Pool::addTask(Task *task)
{
    if (Stop)	//线程池是否停止工作
    {
        return;
    }

    //向任务队列中添加新任务
    taskCond.lock();
        taskList.push_back(task);
    taskCond.unlock();

    cond.lock();
    if(waitcount)//需要注意这里的waitcount配置
    {
        if(count < maxcount)
        {
            createThread();
        }

        cond.signal();
    }
    else if(count < maxcount)
    {
        createThread();
    }
    cond.unlock();
}

void E_PThread_Pool::createThread()
{
    pthread_t tid;
    int ret = pthread_create(&tid, NULL, taskThread, (void *)this);
    if (ret < 0)
    {
        perror("pthread create error");
    }
    else
    {
        count++;
    }
}

//线程池创建一定数量的线程
void E_PThread_Pool::start(unsigned NumCreate)
{
    cond.lock();

    for (unsigned i = 0; i < NumCreate && i < maxcount-2; i++) //这里为什么是减2
    {
        createThread();
    }
    cond.unlock();
}

// 工作线程
void * E_PThread_Pool::taskThread(void *arg)
{
    pthread_detach(pthread_self()); //设置自分离
    E_PThread_Pool *pool=(E_PThread_Pool *)arg;
    while(1)
    {
        pool->cond.lock();

        //如果没有工作线程在等待
        if (pool->taskList.empty())
        {
            if(pool->Stop)
            {
                pool->count--;
                pool->cond.unlock();
                pthread_exit(NULL);
            }

            pool->waitcount++;
            bool bSignal = pool->cond.timewait(pool->waitsec); //新任务等待被唤醒
            pool->waitcount--;

            // 删除无用线程
            if (!bSignal && pool->count > pool->mincount)
            {
                pool->count--;
                pool->cond.unlock();
                pthread_exit(NULL);
            }
        }
        pool->cond.unlock();

        //如果有工作线程在等待
        if (!pool->taskList.empty())
        {
            //获取一个工作线程并执行
            pool->taskCond.lock();
            Task *t = pool->taskList.front();
            pool->taskList.pop_front(); //移除工作线程
            pool->taskCond.unlock();

            t->run(); //任务开始
            delete t;
        }
    }
    pthread_exit(NULL);
}


void E_PThread_Pool::destroyThread()
{
    printf("destroy?\n");

#if 0   //等待所有线程执行完毕
    list_task::iterator it = taskList.begin();
    for (; it! = taskList.end(); it++)
    {
        Task *t = *it;
        delete t;

        t = NULL;
    }
    taskList.clear();
#endif

    Stop = true;
    while (count > 0)
    {
        cond.lock();
        cond.broadcast();
        cond.unlock();

        // 等待所有线程执行完毕
        sleep(1);
    }
}

shm共享内存.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "f_shm.h"

#include <sys/types.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <semaphore.h>

typedef struct shmhead_st
{
    int shmid;			// 共享内存ID

    unsigned int blksize;		// 块大小
    unsigned int blocks;		// 总块数
    unsigned int rd_index;		// 读索引
    unsigned int wr_index;		// 写索引

        //必须放在共享内存内部才行
    sem_t sem_mutex;	// 用来互斥用的信号量
    sem_t sem_full;		// 用来控制共享内存是否满的信号量
    sem_t sem_empty;	// 用来控制共享内存是否空的信号量

}shmhead_t;

F_Shm::F_Shm(key_t key, int blksize, int blocks)
{
    this->open_shm(key, blksize, blocks);
}

F_Shm::F_Shm()
{
    shmhead = NULL;
    payload = NULL;
    open = false;
}

F_Shm::~F_Shm()
{
    this->close_shm();
}
//返回头地址
bool F_Shm::creat_shm(key_t key, int blksize, int blocks)
{
    int shmid = 0;

    //1. 查看是否已经存在共享内存,如果有则删除旧的
    shmid = shmget(key, 0, 0);
    if (shmid != -1)
    {
        shmctl(shmid, IPC_RMID, NULL); 	//	删除已经存在的共享内存
    }

    //2. 创建共享内存
    shmid = shmget(key, sizeof(shmhead_t) + blksize*blocks, 0666 | IPC_CREAT | IPC_EXCL);
    if(shmid == -1)
    {
        ERR_EXIT("shmget");
    }
    printf("Create shmid=%d size=%u \n", shmid, sizeof(shmhead_t) + blksize*blocks);

    //3.连接共享内存
    shmhead = shmat(shmid, (void*)0, 0);					//连接共享内存
    if(shmhead == (void*)-1)
    {
        ERR_EXIT("shmat");
    }
    memset(shmhead, 0, sizeof(shmhead_t) + blksize*blocks);		//初始化

    //4. 初始化共享内存信息
    shmhead_t * pHead = (shmhead_t *)(shmhead);
    pHead->shmid	= shmid;				//共享内存shmid
    pHead->blksize	= blksize;			//共享信息写入
    pHead->blocks	= blocks;				//写入每块大小
    pHead->rd_index = 0;					//一开始位置都是第一块
    pHead->wr_index = 0;					//
    sem_init(&pHead->sem_mutex, 1, 1);	// 第一个1表示可以跨进程共享,第二个1表示初始值
    sem_init(&pHead->sem_empty, 1, 0);	// 第一个1表示可以跨进程共享,第二个0表示初始值
    sem_init(&pHead->sem_full, 1, blocks);// 第一个1表示可以跨进程共享,第二个blocks表示初始值

    //5. 填充控制共享内存的信息
    payload = (char *)(pHead + 1);	//实际负载起始位置
    open = true;

    return true;
}

void F_Shm::dsy_shm()
{
    shmhead_t *pHead = (shmhead_t *)shmhead;
    int shmid = pHead->shmid;

    //删除信号量
    sem_destroy (&pHead->sem_full);
    sem_destroy (&pHead->sem_empty);
    sem_destroy (&pHead->sem_mutex);
    shmdt(shmhead); //共享内存脱离

    //销毁共享内存
    if(shmctl(shmid, IPC_RMID, 0) == -1)		//删除共享内存
    {
        printf("Delete shmid=%d \n", shmid);
        ERR_EXIT("shmctl rm");
    }

    shmhead = NULL;
    payload = NULL;
    open = false;
}

void F_Shm::Destroy(key_t key)
{
    int shmid = 0;

    //1. 查看是否已经存在共享内存,如果有则删除旧的
    shmid = shmget(key, 0, 0);
    if (shmid != -1)
    {
        printf("Delete shmid=%d \n", shmid);
        shmctl(shmid, IPC_RMID, NULL); 	//	删除已经存在的共享内存
    }
}

//返回头地址
bool F_Shm::open_shm(key_t key, int blksize, int blocks)
{
    int shmid;

    this->close_shm();

    //1. 查看是否已经存在共享内存,如果有则删除旧的
    shmid = shmget(key, 0, 0);
    if (shmid == -1)
    {
        return this->creat_shm(key, blksize, blocks);
    }

    //2.连接共享内存
    shmhead = shmat(shmid, (void*)0, 0);					//连接共享内存
    if(shmhead == (void*)-1)
    {
        ERR_EXIT("shmat");
    }
    printf("Open shmid=%d size=%u \n", shmid, sizeof(shmhead_t) + blksize*blocks);

    //3. 填充控制共享内存的信息
    payload = (char *)((shmhead_t *)shmhead + 1);	//实际负载起始位置
    open = true;

    return true;
}


//关闭共享内存
void F_Shm::close_shm(void)
{
    if(open)
    {
        shmdt(shmhead); //共享内存脱离
        shmhead = NULL;
        payload = NULL;
        open = false;
    }
}

void F_Shm::write_into_shm(const void *buf)
{

    shmhead_t *pHead = (shmhead_t *)shmhead;

    sem_wait(&pHead->sem_full);				//是否有资源写?	可用写资源-1
    sem_wait(&pHead->sem_mutex);				//是否有人正在写?

    printf("write to shm[%d] index %d \n", pHead->shmid, pHead->rd_index);
    memcpy(payload + (pHead->wr_index) * (pHead->blksize), buf, pHead->blksize);
    pHead->wr_index = (pHead->wr_index+1) % (pHead->blocks);	//写位置偏移
    sem_post(&pHead->sem_mutex);				//解除互斥
    sem_post(&pHead->sem_empty);				//可用读资源+1
}

void F_Shm::read_from_shm(void *buf)
{
    shmhead_t *pHead = (shmhead_t *)shmhead;

    sem_wait(&pHead->sem_empty);				//检测写资源是否可用

    printf("read from shm[%d] index %d \n", pHead->shmid, pHead->rd_index);
    memcpy(buf, payload + (pHead->rd_index) * (pHead->blksize), pHead->blksize);

    //读位置偏移
    pHead->rd_index = (pHead->rd_index+1) % (pHead->blocks);
    sem_post(&pHead->sem_full);					//增加可写资源
}

协议包包头.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef I_PACKET_PUBLIC_H
#define I_PACKET_PUBLIC_H

#include <string>
#include <iostream>

using namespace std;


#define MAX_LEN      256

/************接入层数据包头************/

typedef struct packet_header_st
{
    int fd;//用于前后端通信即目标客户端fd(服务器用到)
    int funcId; // 功能号
        //登录包0x01,注册包0x02,找回密码0x03,心跳包0x04

        //客户端上传视频点播请求功能0x10 客户端上传视频点播时长功能0x11
        //播放历史请求包0x20
        //请求视频列表0x30

    int optid; // 操作码:请求0x00 和 应答0x01

    int usrlenth;// 包体的长度
    int packet_seq; //包序号
    int packet_sum; //包总数

    char srcAddr[6]; //预留
    char dstAddr[6]; //预留

    int syn; // 判断包头是否正确 0x04
}packet_header_t;

/************接入层数据包尾************/

typedef struct packet_tali_st//包尾,用来验证数据包的完整性
{
    int pack_tail;//设置为0x05
}packet_tali_t;

/************数据包报文整体************/

typedef struct  packet_all_st
{
    packet_header_t head;
    char body[1024-sizeof(packet_header_t)-sizeof(packet_tali_st)];
    packet_tali_st tail;
    //unsigned len; //要发送的数据有效长度
}packet_all_st;


/************业务层数据包体************/

typedef struct Pant//心跳结构体 功能号 0000
{
    bool flag;//心跳状态,true-在线,flase-离线
}Pant_t;


//客户端登录请求包
typedef struct login
{
    int id;
    char psw[10];       //密码
}Login_t;

//登录应答包
typedef struct res_login_st
{
    int login_ret;  //登录结果: 1-登录成功,0-登录失败
}res_login_t;

//客户端注册请求包
typedef struct Register
{
    int id; //账号
    char psw[10];       //密码
}Register_t;

//注册应答包
typedef struct res_register_st
{
    int register_ret;	//注册结果: 0-注册成功,1-注册失败
}res_register_t;

//客户端修改密码请求包
typedef struct Change_PWD
{
    int id; //账号
    char psw[10];       //密码
}c_pwd_t;

//注册应答包
typedef struct res_changepwd_st
{
    int change_ret;	//注册结果: 0-注册成功,1-注册失败
}res_cpwd_t;

//找回密码请求包
typedef struct findpwd
{
    int id;
}F_Pwd_t;

//忘记密码应答包
typedef struct res_findpwd_st
{
    int find_ret;	//找回结果: 0-找回成功,1-找回失败
    char pwd[20];   //密码
}res_fpwd_t;


/************请求业务交易流水请求包************/

//上传视频点播请求包
typedef struct VideoPlay
{
    int id;
    char video_id[20];//视频ID
}VideoPlay_t;

//点播视频应答包
typedef struct res_VideoPlay_st
{
    char video_id[20];  //视频ID
    char video_name[20];  //视频名称
}res_videopaly_t;

//上传停止播放请求包
typedef struct VideoStop
{
    int user_id;    //用户ID
    char video_id[20];//视频ID
    char video_seek[20];//播放时长
}VideoStop_t;

//视频列表请求包
typedef struct VideoList
{
    int funcId;
    /*
        电视剧0x01,动漫0x02,电影0x03,综艺0x04,纪实0x05,少儿0x06,新闻0x07
    */
}VideoList_t;

//视频列表应答包
typedef struct Res_VideoList
{
    int funcId; //功能号,即频道
    char V[800];
}res_vl;

//播放历史请求包
typedef struct Histort
{
    int user_id;
}his_t;

//播放历史应答包
typedef struct History_get
{
   char V[200];//视频id数组
//   int percent[5];//播放时间数组
}hostory_t;


//历史记录上传
typedef struct Up_Record
{
    int user_id;
    int percent;
    char v_name[10];
    char v_time[20];

}up_record_t;

#endif // PACKET_BASE_H

解压包代码.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "i_packet_base.h"

#include <iostream>
#include <unistd.h>
#include <string.h>

using namespace std;

I_Packet_base::I_Packet_base(int size)
:m_size(size)
{
    m_data = new char[m_size];
}

I_Packet_base::I_Packet_base(const I_Packet_base &packet)
{
    m_size = packet.m_size;
    m_data = new char[packet.m_size];
    memcpy(m_data, packet.m_data, packet.m_size);

}

I_Packet_base::~I_Packet_base()
{
    delete []m_data;
}

char *I_Packet_base::getData()
{
    return m_data;
}

unsigned int I_Packet_base::getSize()
{
    return m_size;
}

I_Packet_base & I_Packet_base::operator =(const I_Packet_base &packet)
{
    if(m_size != packet.m_size)
    {
        delete []m_data;

        m_size = packet.m_size;
        m_data = new char[packet.m_size];
    }
    memcpy(m_data, packet.m_data, packet.m_size);
    return *this;
}

嗯,实在太多,全放进来的话这篇文章就会因为太长而无法发布,有兴趣的小伙伴可以私信我。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/05/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
黄仁勋:AI正在吃掉软件行业,未来每家房子都有深度学习能力
若朴 李林 编译整理 量子位 报道 | 公众号 QbitAI 很少有CEO可以领导同一家公司超过20年,黄仁勋做到了。1993年,30岁的黄仁勋和伙伴一起创立了英伟达(Nvidia),并从那时开始掌管
量子位
2018/03/30
7120
黄仁勋:AI正在吃掉软件行业,未来每家房子都有深度学习能力
黄仁勋GTC主旨演讲:从摩尔定律的尽头到深度学习大爆炸,发布新一代GPU,市值突破700亿美元( PPT)
【新智元导读】英伟达CEO黄仁勋一年一度的GTC主旨演讲凌晨结束,新智元第一时间带来了深度报道(带PPT的)。本次大会最受关注的是,英伟达发布了新一代的GPU,涉及不少新的技术,比如tensor。此外, 还有“面向TensorFlow 的TensorRT”、“英伟达GPU云”“AI 研究基础设施DGX-1和DGX Station”、“开源 Xavier DLA ” 等等。黄仁勋从摩尔定律走向消亡谈起,一直说到深度学习的大爆炸。一起来看看股票涨幅“不可阻挡”的英伟达都有哪些布局。 5月11日凌晨,英伟达CEO
新智元
2018/03/28
1.1K0
黄仁勋GTC主旨演讲:从摩尔定律的尽头到深度学习大爆炸,发布新一代GPU,市值突破700亿美元( PPT)
CES 2017 | Nvidia黄仁勋领衔:从云上的游戏电脑 到与奥迪合作真正AI车(完整视频)
大数据文摘作品,转载要求见文末 作者 | Aileen,Yawei Xia,魏子敏 英伟达CEO黄仁勋在CES2017大会发表展前主题演讲 如果有人说科技圈给人的刻板印象是nerd(书呆子),那他一定没有见识过CES。每年1月召开,这场已经连续举办了50年的国际消费类电子产品展览会(CES)的规模和受到的关注度不亚于各类时尚大秀。而近几年,城会玩儿的科技咖们更是把科技发布会移到了拉斯维加斯这座party之城。 今年,汽车科技厂商占据了CES的重头戏。为此,CES还专门开辟了自动驾驶演示场地。大会5日开幕
大数据文摘
2018/05/24
5310
黄仁勋预测:5年内或能实现AGI!全力满足中国需求,美国距「供应链独立」还有10年
最近,在《纽约时报》的年度DealBook峰会上,黄仁勋表示,如果把通用人工智能(AGI)定义为能以「相当有竞争力」的方式完成人类智能测试的计算机,那么在未来五年内,我们将看到AGI。
新智元
2023/12/05
2690
黄仁勋预测:5年内或能实现AGI!全力满足中国需求,美国距「供应链独立」还有10年
黄仁勋谈 GPU 大战:每年都有“英伟达杀手”跳出来,但无人成功
作者 | Timothy Prickett Morgan  译者 | 核子可乐,刘燕   伟大的技术人员总是着眼于未来,在无数工程师的协同努力下把前景转化为现实。也正是这种从愿景到规范、由规范到现实、再由现实到收益的重复循环,推动世界不断进步。 过去十五年来,英伟达就一直身处这种从创造到扩张的良性循环当中。近日,The Next Platform 记者 Timothy Prickett Morgan 专访了英伟达联合创始人兼 CEO 黄仁勋,探讨了数据中心的后续发展,以及 Omniverse 这一融合了模拟
深度学习与Python
2023/04/01
3480
黄仁勋谈 GPU 大战:每年都有“英伟达杀手”跳出来,但无人成功
奔跑吧,年轻人:黄仁勋台大对毕业生演讲
机器之心报道 编辑:李泽南、蛋酱 处于 AI 时代的你,将要创造什么? “You are running for food, or you are running from becoming food. And often times, you can’t tell which. Either way, run.” 「为了食物而奔跑,或者为了避免成为食物而奔跑,很多时候,你无法分辨是哪一种情况。不管是哪一种,都要奔跑。 5月27日,在台湾大学的毕业典礼上,黄仁勋以致辞嘉宾的身份发表了一段长达23分钟的演
机器之心
2023/05/31
5190
奔跑吧,年轻人:黄仁勋台大对毕业生演讲
黄仁勋:Nvidia不是游戏公司,我们希望推动下一个人工智能大爆炸
黄仁勋,标志性的黑色皮夹克,为母校斯坦福捐了一座用自己名字命名的工程大楼,位置就在另一位斯坦福华裔校友,雅虎总裁杨致远捐赠的工程楼旁边。
新智元
2020/07/09
8340
黄仁勋:Nvidia不是游戏公司,我们希望推动下一个人工智能大爆炸
黄仁勋亲自给OpenAI送货,全球首台DGX H200开箱了
OpenAI 联合创始人、总裁 Greg Brockman 发推,晒出了自己、OpenAI CEO 奥特曼与英伟达创始人兼 CEO 黄仁勋的合照。
机器之心
2024/04/26
1910
黄仁勋最新2万字演讲实录:将打破摩尔定律发布新产品,机器人时代已经到来
腾讯科技讯 6月2日,英伟达联合创始人兼首席执行官黄仁勋在Computex 2024(2024台北国际电脑展)上发表主题演讲,分享了人工智能时代如何助推全球新产业革命。
小腾资讯君
2024/06/05
3580
黄仁勋最新2万字演讲实录:将打破摩尔定律发布新产品,机器人时代已经到来
黄仁勋5000亿豪赌:AI超算首次Made in USA!
未来四年内,英伟达将通过与台积电、富士康、纬创资通、安靠(Amkor)和矽品(SPIL)的合作,在美国打造出价值5000亿美元的AI基础设施。
新智元
2025/04/16
1090
黄仁勋5000亿豪赌:AI超算首次Made in USA!
黄仁勋最新对话:未来互联网流量将大幅减少,计算将更多即时生成
① 黄仁勋强调生成式AI正以指数速度增长,企业需要迅速适应并利用这一技术,而不是观望,以免落后于技术发展的步伐。
小腾资讯君
2024/06/18
3690
黄仁勋最新对话:未来互联网流量将大幅减少,计算将更多即时生成
黄仁勋最新访谈:自曝每天使用ChatGPT,每次演讲都硬着头皮上
在Arm携手美国全国公共媒体(NPM)精心打造的定制化播客系列《Tech Unheard》的首秀中,英伟达首席执行官黄仁勋作为特邀嘉宾接受了Arm首席执行官雷内·哈斯(Rene Haas)的独家专访。哈斯对黄仁勋赞誉有加,认为他是一位名副其实的远见卓识者。
小腾资讯君
2024/10/15
2410
英伟达颠覆CPU!长发黄仁勋杀入英特尔地盘,Arm架构CPU性能高10倍
今年,「GPU大哥」英伟达居然「不讲武德」,发布一个基于Arm架构的新数据中心CPU Nvidia Grace,它将直接挑战英特尔在服务器和数据中心计算领域的主导地位。
新智元
2021/04/15
4840
黄仁勋打响CES第一枪:全球最强芯DRIVE Xavier武装自动驾驶
新智元编辑部 【新智元导读】英伟达CES发布会,黄仁勋全力投入自动驾驶市场,发布了四大关键产品和平台,从各个方面提升驾驶体验。英伟达的自动驾驶平台合作伙伴,也已经增长到320+家。 老黄说,每年新年初始开启CES都让他很激动万分。 或许是太过激动,以及时间上的原因(晚上8点的主旨演讲),虽然经过了2次演习,但还是在现场一度说不出话来。上气不接下气,“CEO的工作不应该如此rigid。”黄在台上说。 但是,凭借强大的控场能力,黄仁勋在说笑中继续,并发布了围绕自动驾驶相关的4大关键产品和平台。 瞄准千亿美元自动
新智元
2018/03/20
1K0
黄仁勋打响CES第一枪:全球最强芯DRIVE Xavier武装自动驾驶
用20块GPU装下整个互联网!本次GTC大会,黄仁勋继续大秀「AI肌肉」
点击图片报名 老黄:不装了,我就是AI。 作者 | 来自镁客星球的家衡 就在今天凌晨,英伟达CEO黄仁勋带来了名为“I AM AI”的GTC 2022线上主题演讲! 即便告别了我们熟悉的厨房,但黄仁勋照样能给我们端上多道“硬核大菜”。 先是搭载全新Hopper架构的H100 GPU,接着是Grace超级芯片,然后依次谈到了机器人、自动汽车以及其他软件更新。 总的来看,英伟达再度将GPU的算力推向了极致,借此加强自身在AI、汽车等领域的实力。同时,英伟达已经为下一波AI浪潮以及无限幻想的元宇宙做好了准备。
镁客网
2022/03/25
5020
英伟达CPU面世!基于Arm,性能超过英特尔为核心的自家系统10倍,连客户都找好了
这次的演讲和之前有所不同,可以从下图明显看到,黄教主的脸逐渐圆润、头发也越留越长了。
大数据文摘
2021/04/15
5320
【黄仁勋苏州GTC演讲】摩尔定律已终结,计算的未来离不开GPU
2018年一度被传要“泡汤”的最后一场GTC,今天如期在苏州举行,现场气氛火爆,参与人数可能又创下了历史新高。
新智元
2018/12/18
7410
【黄仁勋苏州GTC演讲】摩尔定律已终结,计算的未来离不开GPU
黄仁勋定律是新的摩尔定律!这就是黄教主收购Arm的原因
华尔街日报报道称,摩尔定律正在放缓,但有一项新定律,可能对计算下半个世纪同样重要。
新智元
2020/09/25
1.1K0
黄仁勋定律是新的摩尔定律!这就是黄教主收购Arm的原因
回放订阅 | NVIDIA CEO 黄仁勋 GTC CHINA 2019 主题演讲
Orin是英伟达花费4年时间投入数十亿美元打造,性能比最新一代Xavier提升7倍,算力最高可达200TOPS。
AI研习社
2019/12/23
7000
回放订阅 | NVIDIA CEO 黄仁勋 GTC CHINA 2019 主题演讲
英伟达CEO黄仁勋专访 | All IN深度学习自动驾驶,打响芯片热战
【新智元导读】英伟达2016年Q2财报大好,股价创历史新高,从CEO黄仁勋投资人会议发言可以看出,英伟达接下来有向数据中心和自动驾驶发力的迹象,这两者核心还是深度学习。日前英特尔宣布收购初创公司Nervana,CPU巨头终于在深度学习芯片市场与英伟达短兵相交。本文后附华盛顿大学英伟达技术产品报告,用数据告诉你GPU巨头如何深耕深度学习。 上周四,英伟达2016年Q2财报公布,表现超出预期,英伟达股价随后也创下历史新高,不仅如此,市场对英伟达Q3的预期也比原来增加了2亿美元。 英伟达Q2销售额共计14.3亿美
新智元
2018/03/23
9100
英伟达CEO黄仁勋专访 | All IN深度学习自动驾驶,打响芯片热战
推荐阅读
黄仁勋:AI正在吃掉软件行业,未来每家房子都有深度学习能力
7120
黄仁勋GTC主旨演讲:从摩尔定律的尽头到深度学习大爆炸,发布新一代GPU,市值突破700亿美元( PPT)
1.1K0
CES 2017 | Nvidia黄仁勋领衔:从云上的游戏电脑 到与奥迪合作真正AI车(完整视频)
5310
黄仁勋预测:5年内或能实现AGI!全力满足中国需求,美国距「供应链独立」还有10年
2690
黄仁勋谈 GPU 大战:每年都有“英伟达杀手”跳出来,但无人成功
3480
奔跑吧,年轻人:黄仁勋台大对毕业生演讲
5190
黄仁勋:Nvidia不是游戏公司,我们希望推动下一个人工智能大爆炸
8340
黄仁勋亲自给OpenAI送货,全球首台DGX H200开箱了
1910
黄仁勋最新2万字演讲实录:将打破摩尔定律发布新产品,机器人时代已经到来
3580
黄仁勋5000亿豪赌:AI超算首次Made in USA!
1090
黄仁勋最新对话:未来互联网流量将大幅减少,计算将更多即时生成
3690
黄仁勋最新访谈:自曝每天使用ChatGPT,每次演讲都硬着头皮上
2410
英伟达颠覆CPU!长发黄仁勋杀入英特尔地盘,Arm架构CPU性能高10倍
4840
黄仁勋打响CES第一枪:全球最强芯DRIVE Xavier武装自动驾驶
1K0
用20块GPU装下整个互联网!本次GTC大会,黄仁勋继续大秀「AI肌肉」
5020
英伟达CPU面世!基于Arm,性能超过英特尔为核心的自家系统10倍,连客户都找好了
5320
【黄仁勋苏州GTC演讲】摩尔定律已终结,计算的未来离不开GPU
7410
黄仁勋定律是新的摩尔定律!这就是黄教主收购Arm的原因
1.1K0
回放订阅 | NVIDIA CEO 黄仁勋 GTC CHINA 2019 主题演讲
7000
英伟达CEO黄仁勋专访 | All IN深度学习自动驾驶,打响芯片热战
9100
相关推荐
黄仁勋:AI正在吃掉软件行业,未来每家房子都有深度学习能力
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档