주요 콘텐츠

arrayfun

GPU에서 배열의 각 요소에 함수 적용

설명

참고

함수 실행이 CPU가 아닌 GPU에서 발생한다는 점을 제외하면 이 함수는 MATLAB® 함수 arrayfun과 유사하게 작동합니다. GPU에 아직 없는 모든 필수 데이터는 GPU 메모리로 이동합니다. 실행을 위해 전달된 MATLAB 함수는 컴파일되고 GPU에서 실행됩니다. 모든 출력 인수는 gpuArray 객체로 반환됩니다.

B = arrayfun(func,A)는 함수 funcgpuArray A의 각 요소에 적용한 다음 func의 출력값을 출력 gpuArray B로 결합합니다. BA와 크기가 같고 B(i,j,...) = func(A(i,j,...))입니다. 입력 인수 func는 하나의 입력 인수를 받고 스칼라를 반환하는 MATLAB 함수에 대한 함수 핸들입니다. funcA의 요소 수만큼 호출됩니다.

예제

B = arrayfun(func,A1,...,An)func를 배열 A1,...,An의 요소에 적용하므로 B(i,j,...) = func(A1(i,j,...),...,An(i,j,...))이 됩니다. 함수 funcn개의 입력 인수를 받고 스칼라를 반환해야 합니다. A1,...,An의 크기는 서로 일치하거나 호환되어야 합니다.

예제

[B1,...,Bm] = arrayfun(func,___)는 함수 funcm개의 출력값을 반환할 때 다중 출력 배열 B1,...,Bm을 반환합니다. func는 데이터형이 다른 출력 인수를 반환할 수 있지만, 각 출력값의 데이터형은 func가 호출될 때마다 동일해야 합니다.

예제

예제

모두 축소

함수 cal을 정의합니다. 함수 cal은 측정 데이터로 구성된 배열에 이득 및 오프셋 수정을 적용합니다. 이 함수는 rawdata 배열의 각 요소에 gain 인자와 offset을 적용하면 요소별 연산만을 수행합니다.

function c = cal(rawdata,gain,offset)
c = (rawdata.*gain) + offset;
end

측정 데이터로 구성된 배열을 만듭니다.

meas = 1:4
meas = 1×4

     1     2     3     4

이득과 오프셋 데이터를 포함하는 배열을 만듭니다.

gn   = rand([1 4],"gpuArray")/100 + 0.995
gn =

    0.9958    0.9967    0.9985    1.0032
offs = rand([1 4],"gpuArray")/50  - 0.01
offs =

    0.0063   -0.0045   -0.0081    0.0002

GPU에서 보정 함수를 실행합니다. 입력 인수 gnoffs가 이미 GPU 배열이고 따라서 GPU 메모리에 있으므로 이 함수는 GPU에서 실행됩니다. 함수가 실행되기 전에 입력 배열 measgpuArray 객체로 변환됩니다.

corrected = arrayfun(@cal,meas,gn,offs)
corrected =

    1.0021    1.9889    2.9874    4.0129

GPU에서 소수의 요소별 연산을 수행한다고 해서 코드 속도가 향상될 가능성은 매우 낮습니다. arrayfun 실행 속도가 입력 배열 크기에 따라 어떻게 달라지는지 보여주는 예는 Improve Performance of Element-Wise MATLAB Functions on the GPU Using arrayfun 항목을 참조하십시오.

다중 입력값에 요소별 연산을 적용하고 다중 출력값을 반환하는 함수를 정의합니다.

function [o1,o2] = myFun(a,b,c)
o1 = a + b;
o2 = o1.*c + 2;
end

gpuArray 입력 데이터를 만들고 GPU에서 함수를 실행합니다.

s1 = rand(400,"gpuArray");
s2 = rand(400,"gpuArray");
s3 = rand(400,"gpuArray");
[o1,o2] = arrayfun(@myFun,s1,s2,s3);
whos
  Name        Size               Bytes  Class       Attributes

  o1        400x400            1280000  gpuArray              
  o2        400x400            1280000  gpuArray              
  s1        400x400            1280000  gpuArray              
  s2        400x400            1280000  gpuArray              
  s3        400x400            1280000  gpuArray              

난수 R을 생성하고 사용하는 함수를 정의합니다.

function Y = myRandFun(X)
R = rand;
Y = R.*X;
end

GPU에서 함수를 실행합니다. G는 4×4 gpuArray 객체이므로 arrayfunmyRandfun 함수를 16번 적용하여 16개의 서로 다른 난수 스칼라 값 H를 생성합니다.

G = ones(4,"gpuArray")*2;
H = arrayfun(@myRandFun,G)
H =

    1.0557    0.3599    1.5303    0.2745
    0.4268    1.1226    1.5261    1.7068
    0.0302    0.5814    0.2556    0.3902
    1.1210    1.5310    1.3665    0.8487

입력 인수

모두 축소

입력 배열로 구성된 요소에 적용할 함수로, 함수 핸들로 지정됩니다.

  • func는 스칼라 값을 반환해야 합니다.

  • func는 호출될 때마다 각 출력 인수에 대해 동일한 클래스의 값을 반환해야 합니다.

  • func는 숫자형 입력 데이터 또는 논리형 입력 데이터를 받아야 합니다.

  • func는 MATLAB 언어로 작성한 함수에 대한 핸들이어야 합니다. func를 MEX 함수에 대한 핸들로 지정할 수 없습니다.

  • func를 정적 메서드 또는 클래스 생성자 메서드로 지정할 수 없습니다.

func에는 다음과 같은 내장 MATLAB 함수와 연산자가 포함될 수 있습니다.

abs
and
acos
acosh
acot
acoth
acsc
acsch
asec
asech
asin
asinh
atan
atan2
atanh
beta
betaln
bitand
bitcmp
bitget
bitor
bitset
bitshift
bitxor
cast
ceil
complex
conj
cos
cosh
cot
coth
csc
csch
double
eps
eq
erf
erfc
erfcinv
erfcx
erfinv
exp
expm1
false
fix
floor
gamma
gammaln
ge
gt
hypot
imag
Inf
int8
int16
int32
int64
intmax
intmin
isfinite
isinf
isnan
ldivide
le
log
log2
log10
log1p
logical
lt
max
min
minus
mod
NaN
ne
not
ones
or
pi
plus
pow2
power
rand
randi
randn
rdivide
real
reallog
realmax
realmin
realpow
realsqrt
rem
round
sec
sech
sign
sin
single
sinh
sqrt
tan
tanh
times
true
uint8
uint16
uint32
uint64
xor
zeros

+
-
.*
./
.\
.^
==
~=
<
<=
>
>=
&
|
~
&&
||

다음의 스칼라 확장 버전:

*
/
\
^
분기 명령어:
break
continue
else, elseif, if
for
return
switch, case, otherwise
while

배열을 생성하는 함수(예: Inf, NaN, ones, rand, randi, randn, zeros)는 크기 사양을 입력 인수로 지원하지 않습니다. 그 대신, 생성된 배열의 크기는 함수에 대한 입력 변수의 크기에 따라 결정됩니다. 입력 변수 또는 출력 변수의 필요를 충족하기에 충분한 배열 요소가 생성됩니다. 클래스 구문과 like 구문을 모두 사용하여 데이터형을 지정할 수 있습니다. 다음 예는 배열 생성 함수에 지원되는 구문을 보여줍니다.

a = rand;
b = ones;
c = zeros(like=x);
d = Inf("single");
e = randi([0 9],"uint32");

rand, randi, randn을 사용하여 func 내에서 난수를 생성할 때, 각 요소는 다른 서브스트림에서 생성됩니다. GPU에서의 난수 생성에 대한 자세한 내용은 Random Number Streams on a GPU 항목을 참조하십시오.

func 내에서 switch, case, otherwise를 사용하는 경우 case 표현식은 숫자형 값과 논리값만 지원합니다.

입력 배열로, 스칼라, 벡터, 행렬 또는 다차원 배열로 지정됩니다. GPU에서 실행하려면 arrayfun에 대해 gpuArray 입력 배열 인수가 적어도 하나 이상 있어야 합니다. CPU 메모리에 저장된 각 배열은 함수가 실행되기 전에 gpuArray로 변환됩니다. 동일한 배열로 arrayfun을 여러 번 호출하려는 경우, 해당 배열을 gpuArray로 변환하는 것이 더 효율적입니다.

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

출력 인수

모두 축소

출력 배열로, gpuArray로 반환됩니다.

제한 사항

  • A1,...,An의 크기는 서로 일치하거나 호환되어야 합니다. 출력 배열 B의 크기는 A1,...,An의 크기에 따라 달라집니다. 자세한 내용은 기본 연산에 대해 호환되는 배열 크기 항목을 참조하십시오.

  • arrayfun이 지원하는 연산은 엄격하게 요소별로 수행되고, 각 요소의 각 계산은 다른 요소와 독립적으로 수행되기 때문에 다음과 같은 특정 제한이 적용됩니다.

    • 입력 배열과 출력 배열은 형태나 크기를 변경할 수 없습니다.

    • rand와 같은 배열 생성 함수는 크기 사양을 지원하지 않습니다. 난수로 구성된 배열에는 각 요소에 대한 독립적인 스트림이 있습니다.

  • arrayfun이 출력 배열 B의 요소를 계산하는 순서를 사용자가 지정할 수 없으며, 또한 특정 순서로 수행된다고 믿어서도 안 됩니다.

  • MATLAB의 arrayfun과 마찬가지로 행렬 지수 거듭제곱, 곱셈 및 나눗셈(^, *, /, \)은 요소별 계산만 수행합니다.

  • 입력 배열이나 출력 배열의 크기나 형태를 변경하는 연산(cat, reshape 등)은 지원되지 않습니다.

  • 읽기 전용 인덱싱(subsref)은 지원되며, 중첩 함수 내에서 부모(바깥쪽) 함수 작업 공간의 변수에 대한 액세스도 지원됩니다. GPU에서 실행되기 전에 함수에 존재하는 변수를 인덱싱할 수 있습니다. 중첩 함수 내에서 이러한 변수의 할당이나 subsasgn 인덱싱은 지원되지 않습니다. 지원되는 사용법에 대한 예제는 Stencil Operations on a GPU 항목을 참조하십시오.

  • 익명 함수는 부모 함수 작업 공간에 액세스할 수 없습니다.

  • 지원되는 함수를 오버로드하는 것은 허용되지 않습니다.

  • 코드는 스크립트를 호출할 수 없습니다.

  • 할당되지 않은 계산 결과를 저장할 ans 변수가 없습니다. 모든 계산 결과를 변수에 명시적으로 할당하십시오.

  • 영구 변수 또는 전역 변수, parfor, spmd, try/catch와 같은 언어 기능은 지원되지 않습니다.

  • GPU에서 특정 함수를 실행하기 위해 처음으로 arrayfun을 호출할 때에는 GPU 실행을 위한 함수를 설정하기 위해 약간의 오버헤드 시간이 발생합니다. 동일한 함수를 사용한 arrayfun의 후속 호출은 더 빠르게 실행될 수 있습니다.

확장 기능

모두 확장

버전 내역

R2010b에 개발됨

모두 확장