流:一系列将在GPU上按顺序执行的操作
步骤:
定义流:cudaStream_t s1;
创建流:cudaStreamCreate(&s1);
销毁流:cudaStreamDestory(s1);
多GPU编程
统一地址:
CPU和GPU分配使用统一的虚拟地址空间
驱动/设备可以判断数据所在的地址
GPU可以引用指针 另一个GPU上的地址
Host上的地址
两个方面
Peer-to-peer(P2P) memcopies
使用另一个GPU的地址 cudaDeviceEnablePeerAccess( peer_device, 0 )
允许current GPU访问peer_device GPU cudaDeviceCanAccessPeer( &accessible, dev_X, dev_Y)
检查是否dev_X可以访问dev_Y的内存返回0/1(第一个参数)
Peer-to-peer memcopy
cudaMemcpyPeerAsync(void* dst_addr, intdst_dev, void* src_addr, intsrc_dev, size_tnum_bytes, cudaStream_tstream)
两个设备之间拷贝字节
1)如果peer-access允许字节在最短的PCIe路径上传输
2)如果peer-access不允许CUDA驱动通过CPU memory传输
纹理操作
纹理内存的优势:
1.它们是被缓存的,如果它们在texture fetch 中将提供更高的带宽
2.它们不会像全局或常驻内存读取时受内存访问模式的约束
3.寻址计算时的延迟更低,从而提高随机访问数据时的性能
4. 在一个操作中,包装的数据可以通过广播到不同的变量中 5.8-bit和16-bit的整型输入数据可以被转换成在范围[0.0,1.0]或[-1.0,1.0]的浮点数
CPU/GPU协同