ArrayFire로 플레이하기 : 05 First Meet Array (2)


머리말

"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;
	}

추천

출처blog.csdn.net/weixin_42467801/article/details/113612817