一、cudaMalloc、cudaMemcpy和cudaFree 介绍

cuda可以像调用C函数那样将参数传递给核函数
当设备执行任何有用的操作时,都需要分配内存,例如将计算机返回给主机。

来看CUDA内存空间开辟、内存复制和内存释放函数

static __inline__ __host__ cudaError_t cudaMalloc(
  T      **devPtr,
  size_t   size
extern __host__ cudaError_t CUDARTAPI cudaMemcpy(void *dst, const void *src, size_t count, enum cudaMemcpyKind kind);

第四个参数:
cudaMemcpy分 内存从主机拷贝到GPU端,从GPU拷贝到主机,从GPU拷贝到GPU。

* CUDA memory copy types enum __device_builtin__ cudaMemcpyKind cudaMemcpyHostToHost = 0, /**< Host -> Host */ cudaMemcpyHostToDevice = 1, /**< Host -> Device */ cudaMemcpyDeviceToHost = 2, /**< Device -> Host */ cudaMemcpyDeviceToDevice = 3, /**< Device -> Device */ cudaMemcpyDefault = 4 /**< Direction of the transfer is inferred from the pointer values. Requires unified virtual addressing */
extern __host__ __cudart_builtin__ cudaError_t CUDARTAPI cudaFree(void *devPtr);

二、CUDA编程七步曲

一个完整的CUDA代码需要包含七个步骤:
1、获取设备
2、分配显存
3、数据传输 (从CPU到GPU)
4、核函数
5、数据传输(从GPU到CPU)
6、释放显存空间
7、重置设备(可以省略)

#include <iostream>
#include "cuda_runtime.h"
__global__ void add(int a, int b, int *c)
    *c = a + b;
int main() {
    int *c;
    int *dev_c;
    cudaError_t cudaStatus;
    cudaStatus = cudaMalloc(&dev_c, sizeof(int)); // 开辟内存
    if(cudaSuccess != cudaStatus)
        fprintf(stderr, "cuda melloc error!");
        return -1;
    add<<<1, 1>>>(2, 7, dev_c);  // 核函数计算
    cudaStatus = cudaMemcpy(&c, dev_c, sizeof(int), cudaMemcpyDeviceToHost); // 从GPU端拷贝到CPU端
    printf("2 + 7 = %d \n", c);
    cudaFree(dev_c); // 释放GPU上的内存
    std::cout << "Hello, World!" << std::endl;
    return 0;
                    文章目录一、cudaMalloc、cudaMemcpy和cudaFree 介绍二、第一个例子,实现GPU端的加法可以像调用C函数那样将参数传递给核函数当设备执行任何有用的操作时,都需要分配内存,例如将计算机返回给主机。一、cudaMalloc、cudaMemcpy和cudaFree 介绍内存空间开辟、内存复制和内存释放static __inline__ __host__ cudaError_t cudaMalloc(  T      **devPtr,  size_t   size)ex
此示例列举了系统中存在的 CUDA 设备的属性。
此示例针对传输大小为 3KB、15KB、15MB 和 100MB 的可分页、页面锁定和写入组合内存测量主机到设备和设备到主机复制带宽,并以 CSV 格式输出它们。
此示例 jit-in-time 编译 .ptx 并输出错误日志和信息日志。
此示例使用零复制将主机指针映射到设备指针,以便内核可以直接读取和写入固定系统内存。
此示例使用异步 API、动态 ptx 版本选择以及常量和共享内存来添加两个浮点向量。
 此示例使用多个流来利用 HyperQ 技术。
此示例使用多个设备来并行化计算。
利用NVProf查看程序执行情况
gpu不是单独的在计算机中完成任务,而是通过协助cpu和整个系统完成计算机任务,把一部分代码和更多的计算任务放到gpu上处理,逻辑控制、变量处理以及数据预处理等等放在cpu上处理。
host 指的是cp.
以下翻译自 https://docs.nvidia.com/cuda/npp/index.html
文章目录一、What is NPP?二、API接口文档三、头文件、库文件五、编译程序时,NPP库之间的链接关系
一、What is NPP?
NVIDIA NPP是2D图像和信号处理的CUDA加速库。NPP库可以在最大限度地提高灵活性,同时保持高性能。
可以采用以下两种方式使用NPP库
作为一个独立的库,可以最小的工作量向应用程序添加GPU加速
笔者在CUDA学习(十):向量内积的多种方法实现
CUDA(六):多种方法实现向量加
两篇文章中,已经用了多种方法来实现向量内积和向量加,但一直没有详细记录多种方法的区别以及这些不同方法之间的速度差距等等.
这里笔者做分笔记,浅谈cuda加速的基本技巧.
并记录下各种方法快慢的原理
文章目录一、前言二、opencv对图像求和 41ms三、最愚蠢的方法,直接在GPU内循环求和 31418ms!、初级加速:单block,多thread五.
				
你好!对于PyTorch安装超时的问题,有几种可能的原因和解决方法: 1. 下载源的问题:PyTorch通常从官方源或镜像源下载安装包。你可以尝试使用其他源,或者使用代理服务器以解决下载超时问题。以下是一些常见的源: - 官方源:`pip install torch` - 清华镜像源(国内用户推荐):`pip install -i https://pypi.tuna.tsinghua.edu.***程中的网络连接。你可以尝试在其他网络环境下进行安装,比如在家里或者在不同的Wi-Fi网络下。 3. 使用conda进行安装:如果你使用Anaconda或Miniconda作为Python环境管理器,可以尝试使用conda进行安装。打开终端或命令提示符,运行以下命令: conda install pytorch torchvision torchaudio cudatoolkit=xx.x -c pytorch 其中,`xx.x`是你所需的CUDA版本号。如果你不需要CUDA支持,可以省略`cudatoolkit`部分。 4. 增加超时时间:在某些情况下,下载速度较慢可能导致超时问题。你可以尝试通过增加超时时间来解决。在使用pip安装时,可以使用`--default-timeout`参数指定超时时间(以秒为单位)。例如: pip install --default-timeout=100 torch 这将将超时时间设置为100秒。 希望这些方法能够帮助你解决PyTorch安装超时的问题!如果还有其他疑问,请随时提问。
Pytorch遇到报错Expected more than 1 value per channel when training, got input size torch.Size Alter_Lin: 没想到居然是batch的原因 Annaconda的替代品miniforge! hjxu2016: 安装目录下,如我在 C:\ProgramData\miniforge3\.condarc Annaconda的替代品miniforge! 一生都在踩坑的脆弱程序媛: 您好,想问一下修改了Windows下的.condarc文件控制通道,但是使用mamba创建环境的时候还是会去使用这个,请问miniforge的默认通道在哪里呢? Pytorch遇到报错Expected more than 1 value per channel when training, got input size torch.Size shady1543: 这不是你自己写的吗? 【异常检测论文阅读 1】EfficientAD: Accurate Visual Anomaly Detection at Millisecond-Level Latencies Annaconda的替代品miniforge! CUDA库之nvjpeg(一):入门介绍