前言
在《玩转 ArrayFire:04 初识 array(一)》中,我们已经了解到 ArrayFire 的一些具体用法,在这一篇中,我们将继续学习 ArrayFire 的更多用法。
六、索引
像 ArrayFire 中的所有函数一样,索引也可以在 OpenCL/CUDA 设备上并行执行。因此,索引成为 JIT 操作的一部分,并且是使用圆括号而不是方括号来完成的(即作为(0)而不是[0])。要索引 af:: array ,你可以使用以下函数中的一个或一个组合:
- 整数标量
- seq( )表示一个线性序列
- end表示维度的最后一个元素
- span表示整个维度
- row(i) 或 col(i) 指定单行 / 列
- rows(first,last) 或 cols(first,last) 指定行 / 列的跨度
七、访问主机和设备上的 array 内存
array 中的内存可以使用 host() 和 device() 函数访问。host 函数从设备复制数据,并使其在主机上的 C 风格数组中可用。因此,由开发人员管理主机返回的内存。device 函数返回一个指向设备内存的指针/引用,用于与外部 CUDA/OpenCL 内核的互操作性。由于该内存属于 ArrayFire,程序员不应该试图释放/释放该指针。例如,下面是我们如何与 OpenCL 和 CUDA 交互:
// Create an array consisting of 3 random numbers
array a = randu(3, f32);
// Copy an array on the device to the host:
float * host_a = a.host<float>();
// access the host data as a normal array
printf("host_a[2] = %g\n", host_a[2]); // last element
// and free memory using delete:
delete[] host_a;
// Get access to the device memory for a CUDA kernel
float * d_cuda