이 튜토리얼을 보완하려면 Poplar 및 PopLibs 사용자 가이드를 읽어보세요. 소스코드는 여기에 있습니다.
IPU에서 이 튜토리얼을 실행하려면 Poplar SDK 환경을 활성화해야 합니다 (IPU 시스템 시작 안내서 참조).
또한 C++11 표준과 호환되는 C++ toolchain이 필요합니다. 이 튜토리얼의 빌드 명령은 GCC를 사용합니다.
tut2_operations/start_here 작업 디렉터리로 사용하여 tut2.cpp 를 편집기에서 엽니다. 이 파일에는 튜토리얼 1에서 본 것과 유사한 기본 Popar 프로그램 구조가 포함되어 있습니다. 몇 가지 변수가 포함된 Graph를 생성하고 초기화합니다. 그러나 이번에는 popops 라이브러리의 일부 추가 헤더가 포함됩니다.
#include <popops/codelets.hpp>
#include <popops/ElementWise.hpp>
이를 통해 IPU device에 고도로 최적화된 데이터 조작을 위한 라이브러리 함수에 액세스할 수 있습니다.
popops::addCodelets(graph);
addCodelets 와 같은 호출이 PopLibs 라이브러리가 프로그램에서 사용될 때 필요합니다.
g++ --std=c++11 tut2.cpp -lpoplar -lpopops -lpoputil -o tut2
./tut2
코드는 현재 아무 작업도 수행하지 않으므로 Graph에 작업을 추가해 보겠습니다.
// Extend program with elementwise add (this will add to the sequence)
Tensor v3 = popops::add(graph, v1, v2, prog, "Add");
prog.add(PrintTensor("v3", v3));
popops::add 함수는 elements 단위의 add를 수행하기 위해 프로그램 sequence를 확장합니다. 또한 반환된 결과에 대한 graph에 새 변수 v3 를 만들었습니다. 따라서 add operation 후에, v1에 v2의 합한 결과를 v3가 보유합니다.
v3: [
[5.0000000 4.5000000]
[4.0000000 3.5000000]
]
이것이 PopLibs 라이브러리 함수를 사용하는 데 필요한 전부입니다. PopLibs API 문서나 include 헤더 파일을 검색하여 PopLibs 라이브러리의 기능을 확인할 수 있습니다.
작업을 수행하기 위해 라이브러리를 호출할 때 데이터가 operation에 전달되는 방식을 조정하는 방법은 다양합니다. 이는 Tensor.hpp 헤더 파일에 있으며 Poplar API Reference 에 문서화되어 있습니다 .
tutorial 1에서, slicing을 사용했습니다. 데이터를 reshaping하고 tranposing하는 함수도 있다.
// Example element wise addition using a transposed view of the data
Tensor v5 = popops::add(graph, v1, v2.transpose(), prog, "Add");
prog.add(PrintTensor("v5", v5));