머리말
"Playing with ArrayFire : 04 First Meet Array (1)"에서는 ArrayFire의 몇 가지 특정 용도에 대해 배웠으며이 기사에서는 ArrayFire의 더 많은 용도를 계속 학습 할 것입니다.
여섯, 인덱스
ArrayFire의 모든 기능과 마찬가지로 인덱싱도 OpenCL / CUDA 장치에서 병렬로 실행할 수 있습니다. 따라서 인덱스는 JIT 연산의 일부가되며 대괄호 대신 괄호를 사용하여 수행됩니다 (즉, [0] 대신 (0)). af :: array 인덱싱하려면 다음 함수 중 하나 또는 조합을 사용할 수 있습니다.
- 정수 스칼라
- seq ()는 선형 시퀀스를 나타냅니다.
- 끝은 차원의 마지막 요소를 나타냅니다.
- 범위는 전체 치수를 나타냅니다.
- row (i) 또는 col (i)는 단일 행 / 열을 지정합니다.
- rows (first, last) 또는 cols (first, last)는 행 / 열의 범위를 지정합니다.
일곱, 호스트 및 장치의 어레이 메모리에 액세스
배열 의 메모리는 host () 및 device () 함수를 사용하여 액세스 할 수 있습니다. 호스트 기능은 장치에서 데이터를 복사하여 호스트의 C 스타일 어레이에서 사용할 수 있도록합니다. 따라서 개발자는 호스트가 반환 한 메모리를 관리합니다. 장치 함수는 외부 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 = a.device<float>(); // no need to free this
float value;
cudaMemcpy(&value, d_cuda + 2, sizeof(float), cudaMemcpyDeviceToHost);
printf("d_cuda[2] = %g\n", value);
a.unlock(); // unlock to allow garbage collection if necessary
// Because OpenCL uses references rather than pointers, accessing memory
// is similar, but has a somewhat clunky syntax. For the C-API
cl_mem d_opencl = (cl_mem) a.device<float>();
// for the C++ API, you can just wrap this object into a cl::Buffer
// after calling clRetainMemObject.
ArrayFire는 또한 OpenCL cl_mem 참조 및 cl :: Buffer 객체 에서 af :: array 를 생성 하기위한 몇 가지 보조 기능을 제공 합니다 . 자세한 내용은 include / af / opencl.h 파일을 참조하십시오.
마지막으로 af :: array 의 첫 번째 값만 원하는 경우 scalar () 함수를 사용하여 가져올 수 있습니다.
array a = randu(3);
float val = a.scalar<float>();
printf("scalar value: %g\n", val)
8 개의 비트 연산자
표준 수학 함수를 지원하는 것 외에도 정수 데이터 유형을 포함하는 배열 은 AND, OR, XOR을 포함한 비트 연산자도 지원합니다.
int h_A[] = {
1, 1, 0, 0, 4, 0, 0, 2, 0};
int h_B[] = {
1, 0, 1, 0, 1, 0, 1, 1, 1};
array A = array(3, 3, h_A), B = array(3, 3, h_B);
af_print(A); af_print(B);
array A_and_B = A & B; af_print(A_and_B);
array A_or_B = A | B; af_print(A_or_B);
array A_xor_B = A ^ B; af_print(A_xor_B);
9. C 및 C ++에서 ArrayFire API 사용
ArrayFire API는 통합 C / C ++ 헤더 파일에 패키지되어 있습니다. 이 라이브러리를 사용하려면 arrayfire.h 헤더 파일을 포함하고 코딩을 시작하십시오!
다음은 C API를 사용하는 예입니다.
#include <arrayfire.h>
// Generate random data and sum and print the result
int main(void)
{
// generate random values
int n = 10000;
af_array a;
af_randu(&a, n);
// sum all the values
float result;
af_sum_all(&result, a, 0);
printf("sum: %g\n", result);
return 0;
}
다음은 C ++ API를 사용하는 예입니다.
#include <arrayfire.h>
// Generate random data, sum and print the result.
int main(void)
{
// Generate 10,000 random values
af::array a = af::randu(10000);
// Sum the values and copy the result to the CPU:
double sum = af::sum<float>(a);
printf("sum: %g\n", sum);
return 0;
}