当前位置: 首页 > wzjs >正文

手机商城网站如何网站建设的步骤过程ppt

手机商城网站如何,网站建设的步骤过程ppt,设计配色网站,线上设计师做效果图常量内存 __constant__ 是 CUDA 中用于声明常量内存变量的关键字,其作用是在设备的常量内存(constant memory)中分配内存空间。这种内存适用于少量、在核函数中频繁读取但不改变的全局常量数据。 特性描述存储位置GPU 的常量内存&#xff0…

常量内存

__constant__ 是 CUDA 中用于声明常量内存变量的关键字,其作用是在设备的常量内存(constant memory)中分配内存空间。这种内存适用于少量、在核函数中频繁读取但不改变的全局常量数据

特性描述
存储位置GPU 的常量内存(显存中的一个小区域,通常为 64KB)
访问方式所有线程共享,可高效广播
修改方式主机端用 cudaMemcpyToSymbol 修改,设备端不能修改
使用场景所有线程频繁访问同一组常量,例如卷积核、查找表等

1.声明常量变量(在全局作用域) 

__constant__ int constData[256];

注意:这声明了一个存放在 GPU 常量内存上的全局整型数组 constData,不可在设备代码中修改。

2.在主机端初始化常量内存

int hostData[256] = { /* 初始化数据 */ };
cudaMemcpyToSymbol(constData, hostData, sizeof(int) * 256);

⚠️ 使用 cudaMemcpyToSymbol 是唯一向 __constant__ 内存赋值的方式。不能直接写 constData[i] = x;

 对比其他类型

类型可见性访问速度可否修改使用方式
__device__所有设备函数较快✅(设备端)通常用来存储全局变量
__shared__一个线程块内共享非常快线程块内共享存储
__constant__所有线程共享非常快(广播)❌(只读)频繁读取、所有线程访问的全局只读变量

 完整示例代码

#include <iostream>
#include <cuda_runtime.h>__constant__ float coeffs[4];__global__ void kernel(float* data) {int i = threadIdx.x;data[i] = data[i] * coeffs[i % 4];  // 使用常量内存做乘法
}int main() {float hostCoeffs[4] = { 1.0f, 2.0f, 3.0f, 4.0f };float data[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };float* devData;cudaMalloc(&devData, sizeof(data));cudaMemcpy(devData, data, sizeof(data), cudaMemcpyHostToDevice);// 把常量数据复制到 GPUcudaMemcpyToSymbol(coeffs, hostCoeffs, sizeof(hostCoeffs));kernel<<<1, 8>>>(devData);cudaMemcpy(data, devData, sizeof(data), cudaMemcpyDeviceToHost);for (int i = 0; i < 8; ++i) {std::cout << data[i] << " ";}std::cout << std::endl;cudaFree(devData);return 0;
}

事件

CUDA 的 事件(Event) 是一种用于 性能测量、同步和流控制 的机制,它可以记录 GPU 中某个时间点的状态,用于:

  • ⏱️ 精确测量 GPU 上操作(如 kernel 执行、内存拷贝)耗时

  • 🔁 在不同 CUDA 流(stream)中进行同步控制

  • 🧵 检查某些异步操作是否完成

 CUDA 中的事件对象由 cudaEvent_t 表示,可以用来:

作用描述
记录时间点通过 cudaEventRecord() 在 GPU 某个位置插入事件
测量时间间隔cudaEventElapsedTime() 计算两个事件之间的时间(以毫秒为单位)
异步检测完成使用 cudaEventQuery() 检查事件是否已完成
流同步cudaEventSynchronize() 等待某个事件完成
跨流依赖控制使用事件实现不同 stream 间的同步

常用 API 

函数说明
cudaEventCreate(&event)创建事件对象
cudaEventRecord(event, stream)在某个 stream 中记录事件(stream 可为 0,表示默认流)
cudaEventSynchronize(event)等待事件完成(阻塞主机直到事件触发)
cudaEventElapsedTime(&ms, start, stop)计算两个事件之间的时间间隔(单位:毫秒)
cudaEventDestroy(event)销毁事件对象,释放资源

典型使用场景:测量核函数运行时间 

#include <cuda_runtime.h>
#include <iostream>__global__ void myKernel() {int tid = threadIdx.x + blockIdx.x * blockDim.x;if (tid < 10000) {// 模拟计算for (int i = 0; i < 1000; ++i) {}}
}int main() {cudaEvent_t start, stop;float elapsedTime;cudaEventCreate(&start);cudaEventCreate(&stop);cudaEventRecord(start, 0);       // 在默认流中记录开始时间myKernel<<<100, 128>>>();        // 启动核函数cudaEventRecord(stop, 0);        // 记录结束时间cudaEventSynchronize(stop);      // 等待 stop 事件代表的所有前序操作完成cudaEventElapsedTime(&elapsedTime, start, stop);std::cout << "Kernel execution time: " << elapsedTime << " ms" << std::endl;cudaEventDestroy(start);cudaEventDestroy(stop);return 0;
}

cudaEventRecord(start, 0) 只是记录了一个事件插入点

插入到当前设备上的默认流(stream 0)中,表示 “从这时开始有事件要记录”。

stop 为什么必须同步?

因为:

  • 核函数是 异步执行 的,也就是:

    • 主机代码调用 kernel 时不会等待其执行完成;

    • 继续往下执行 cudaEventRecord(stop, 0)

    • 但是这行本身也只是把事件插入到流中,不意味着 kernel 已完成。

为了让我们能正确读取 kernel 执行完的时间,必须同步 stop 事件

cudaEventSynchronize(stop); // 等待 stop 事件代表的所有前序操作完成

跨流同步示例:

cudaStream_t stream1, stream2;
cudaStreamCreate(&stream1);
cudaStreamCreate(&stream2);cudaEvent_t event;
cudaEventCreate(&event);kernel1<<<blocks, threads, 0, stream1>>>();  // 在 stream1 中执行
cudaEventRecord(event, stream1);             // 在 stream1 的尾部记录事件cudaStreamWaitEvent(stream2, event, 0);      // 让 stream2 等待事件完成
kernel2<<<blocks, threads, 0, stream2>>>();  // stream2 中的 kernel 等待 eventcudaStreamDestroy(stream1);
cudaStreamDestroy(stream2);
cudaEventDestroy(event);
  • cudaStream_t 是 CUDA 中的流对象类型,表示一个指令队列。

  • 默认情况下,所有核函数、内存操作都在 默认流(stream 0) 上执行,所有操作是顺序同步执行的

  • 使用多个流,可以让不同核函数或操作并发执行,前提是它们之间没有依赖关系。

cudaEventRecord(event, stream1);

 在 stream1 上记录事件

  • 表示:当 stream1 中所有之前的操作完成时,该事件被“标记为完成”

  • 也就是说,event 表示 kernel1 执行完成的时间点。

cudaStreamWaitEvent(stream2, event, 0);

stream2 等待 event 完成

  • 这句的含义是:stream2 中后续的所有操作都要等到 event 完成之后才能执行

  • 所以此处,stream2 中的 kernel 将会等待 kernel1 执行完。

虽然 stream1stream2 原本是可以并发执行的,

但因为用 cudaStreamWaitEvent 明确加了依赖关系,所以 kernel2 会等 kernel1 完成。


文章转载自:

http://H14CTPa4.qswws.cn
http://uSuBRdmT.qswws.cn
http://TLU3VlLC.qswws.cn
http://FDiXBWyo.qswws.cn
http://PT1WQ4PJ.qswws.cn
http://ZvY2ZQy7.qswws.cn
http://XCpQqRvL.qswws.cn
http://1r0qhFO8.qswws.cn
http://HditBcrH.qswws.cn
http://yH4yE3QS.qswws.cn
http://wELkUHfY.qswws.cn
http://AfwIjyHO.qswws.cn
http://StN6USJq.qswws.cn
http://twwwYwv7.qswws.cn
http://20ARABpr.qswws.cn
http://9Wl3JEaf.qswws.cn
http://xwcW69js.qswws.cn
http://5IEzjy4y.qswws.cn
http://lGQMTnS9.qswws.cn
http://R0bwAp08.qswws.cn
http://RKrJbw0S.qswws.cn
http://PBdKzAP6.qswws.cn
http://M5xdbFze.qswws.cn
http://dpMpVgAR.qswws.cn
http://wCeHCq0J.qswws.cn
http://VTMAnmnp.qswws.cn
http://h5Jkpz8w.qswws.cn
http://cyzH8lWJ.qswws.cn
http://5VIIKraf.qswws.cn
http://T7NX0516.qswws.cn
http://www.dtcms.com/wzjs/632284.html

相关文章:

  • 东莞网站建设效果好重庆第一门户网站
  • 深圳网站建设制作报价做外包装很厉害的网站
  • 制作网站教程视频wordpress分类目录 模版
  • 电商网站怎样做广州建设银行投诉网站
  • thinkphp可以做网站吗盐城网站建设哪家快
  • 营销型网站四大功能单位做好职工养老保险中断补缴的新闻
  • 英迈思做网站怎么样电子商务网站整体策划
  • 深圳律师网站建设技术支持 哈尔滨网站建设
  • 文化推广网站建设心得为网站开发android客户端
  • 教育网站建设开发官网网站系统
  • 网站策划与运营考试题erp沙盘模拟
  • 网络营销推广与策划期末考试跨境电商seo
  • 保定网站seo哪家公司好怎样用wordpress
  • 建站之星设计师珠海九洲旅游开发公司
  • 南京网站设计公司兴田德润优惠吗代理公司网站备案
  • 网站建设合同的验收表响应式网站 768 320
  • asp.net做网站的流程seo网站推广计划
  • 企业网站建设费用记入河北建设工程信息网下载时间
  • m开头的网站开发工具网络seo啥意思
  • 重庆建站模板平台短视频网站平台怎么做
  • 实训课网站开发个人小结wordpress 4.6.3 漏洞
  • 北京高端建站公司温州网站建设开发
  • 设计 企业网站赣州网站建设效果
  • 人防工程做资料的网站手机网站百度关键词排名
  • 杭州专业网站模板网站缺点
  • 做策划的都上哪些网站搜索资料间报告范文
  • 建网站的步骤是哪些网站建设勹金手指下拉
  • 门户网站建设方案的公司美工培训哪个机构好
  • 安徽建设学校网站福建建设执业中心网站
  • 青岛高端模板建站公众号开发者密码是什么意思