cuda 异步函数

为了提高cuda效率使用异步函数是一个很常规的选择,但是异步函数并没有我自己想象的这么智能。

它要你要异步传输的数据在主机端(host)不能被更改,即异步函数只是指示了一个传输的位置指针,并没有对这个数据进行缓存,到真正需要的时候,才会去主机内存中去寻找这个值。所以在做异步的时候要保证异步传输的主机端不能在异步完成(或者说拷贝完成)之前被修改。要不然这个数据就成了修改后的了。

实验代码如下

#include <stdio.h>
#include <cuda_runtime.h>

__global__ void async_kernel(int *x)
{
    printf("%d\n",x[0]);
}

int main(int argc,char *argv[])
{
    int *x,*xd;
    
    cudaStream_t stm;
    cudaStreamCreate(&stm);
    
    cudaMallocHost(&x,sizeof(int));
    cudaMalloc(&xd,sizeof(int));
    
    
    
    printf("Start\n");
    
    x[0]=1;
    cudaMemcpyAsync(xd,x,sizeof(int),cudaMemcpyHostToDevice,stm);
    x[0]=10;
    
    async_kernel<<<1,1,0,stm>>>(xd);
    
    cudaDeviceSynchronize();
    
    printf("End\n");
    fflush(stdout);    
}

执行效果如下

当然别忘了同步函数 cudaDeviceSynchronize();

 

转载于:https://www.cnblogs.com/reedlau/p/4850967.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值