JP2019204348A - 情報処理装置及びその制御方法、並びにプログラム - Google Patents

情報処理装置及びその制御方法、並びにプログラム Download PDF

Info

Publication number
JP2019204348A
JP2019204348A JP2018099796A JP2018099796A JP2019204348A JP 2019204348 A JP2019204348 A JP 2019204348A JP 2018099796 A JP2018099796 A JP 2018099796A JP 2018099796 A JP2018099796 A JP 2018099796A JP 2019204348 A JP2019204348 A JP 2019204348A
Authority
JP
Japan
Prior art keywords
gpu
shader
source
source code
code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2018099796A
Other languages
English (en)
Inventor
譲 大久保
Yuzuru Okubo
譲 大久保
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Canon Inc
Original Assignee
Canon Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Canon Inc filed Critical Canon Inc
Priority to JP2018099796A priority Critical patent/JP2019204348A/ja
Priority to US16/413,786 priority patent/US10957006B2/en
Publication of JP2019204348A publication Critical patent/JP2019204348A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/20Processor architectures; Processor configuration, e.g. pipelining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/60Memory management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/50Lighting effects
    • G06T15/80Shading

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Computer Graphics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

【課題】事前にアプリケーションの配布先のGPU特性が特定できない場合でも、GPU上の処理の高速化を図ることを可能とする。【解決手段】GPUを備える情報処理装置であって、第1のソースコードと、第1のソースコードを複数種類のGPUそれぞれ向けにチューニングした複数の第2のソースコードと、複数の第2のソースコードそれぞれに対応するGPUの属性情報とを含んで構成された命令セットを取得する取得手段と、GPUの属性情報に基づいて、命令セットに含まれる第1のソースコードおよび複数の第2のソースコードの中から、GPUに実行させるソースコードを選択する選択手段203と、選択手段にて選択されたソースコードをGPUが解釈可能なデータ形式にコンパイルするコンパイル手段206と、コンパイル手段にてコンパイルされたコードをGPUに実行させる制御手段207とを有する。【選択図】図2

Description

本発明は、情報処理装置及びその制御方法、並びにプログラムに関する。
従来、画像処理に特化したGPU(Graphics Processing Unit)上で動作する機械語コードをより高速に動作させるための技術が提案されている(例えば、特許文献1)。
特許第4922367号公報
一方、現在主流となっている、スマートフォンへのアプリケーションの配布形態では、OS(Operating System)のバージョン等で配布可能な端末を制限している。これに対し、各スマートフォンに搭載されるGPU特性(GPUベンダ、GPUチップの種類等)を全て把握することは困難であることから、GPU特性を考慮して、アプリケーションを配布可能な端末を制限することは一般的ではない。そのため、特許文献1のようなGPU特性に依存した従来の手法では、アプリケーションの配布先となるスマートフォンごとの構成に適した高速化を施すことが困難である。
また、特定のGPU向けに最適化されたソースコードを異なるGPUにてコンパイルや実行を行った場合、最適化されていないソースコードを実行した場合に比べて処理が遅くなり、非効率となる場合がある。
本発明は、このような状況に鑑み、事前にアプリケーションの配布先のGPU特性が分からない場合でも、GPU上の処理の高速化を図ることを可能とすることを目的とする。
上記課題を解決するために本願発明は以下の構成を有する。すなわち、GPU(Graphics Processing Unit)を備える情報処理装置であって、第1のソースコードと、前記第1のソースコードを複数種類のGPUそれぞれ向けにチューニングした複数の第2のソースコードと、前記複数の第2のソースコードそれぞれに対応するGPUの属性情報とを含んで構成された命令セットを取得する取得手段と、前記GPUの属性情報に基づいて、前記命令セットに含まれる前記第1のソースコードおよび前記複数の第2のソースコードの中から、前記GPUに実行させるソースコードを選択する選択手段と、前記選択手段にて選択されたソースコードを前記GPUが解釈可能なデータ形式にコンパイルするコンパイル手段と、前記コンパイル手段にてコンパイルされたコードを前記GPUに実行させる制御手段とを有する。
本発明によれば、事前にアプリケーションの配布先のGPU特性が特定できない場合でも、GPU上の処理の高速化を図ることができる。
本発明に係る情報処理装置のハードウェア構成の例を示す図。 本発明に係る情報処理装置のソフトウェア構成の例を示す図。 本発明に係る全体処理のフローチャート。 第1の実施形態に係るシェーダコンパイル処理のフローチャート。 本発明に係るシェーダソース格納DBのデータの構成例を示す図。 第1の実施形態に係る使用シェーダソース選択処理のフローチャート。 第2の実施形態に係るシェーダコンパイル処理のフローチャート。 第2の実施形態に係る使用シェーダ選択処理のフローチャート。 第2の実施形態に係る使用シェーダ選択処理を説明するための図。 第3の実施形態に係るシェーダコンパイル処理のフローチャート。
以下、本発明を実施するための形態について図面などを参照して説明する。なお、実施形態は、本発明を限定するものではなく、また、実施形態で説明されている全ての構成が本発明の課題を解決するための手段に必須であるとは限らない。
<第1の実施形態>
[ハードウェア構成]
本実施形態に係る情報処理装置の一例として、以下では情報処理装置100を例に挙げて説明する。
図1は、情報処理装置100のハードウェア構成例を示す図である。情報処理装置100は、SoC(System on a Chip)101、ROM(Read Only Memory)104、RAM(Random Access Memory)105、表示部108、外部入力部109、記憶部110、通信部111を含んで構成される。SoC101は、CPU(Central Processing Unit)102、およびGPU103を含んで構成される。また、各部位は、データバス106および入出力インターフェース107を介して、通信可能に接続される。
本実施形態において、情報処理装置100は、スマートフォンやタブレット等の小型の持ち運び可能な携帯端末を想定して説明を行う。しかし、情報処理装置100は、同様の構成であれば、一般的なラップトップコンピュータやデスクトップコンピュータであってもよい。さらに、情報処理装置100がクライアントとして機能し、外部装置であるサーバ(不図示)からプログラム(アプリケーション)をネットワーク経由で受信し、受信したプログラムを実行するようなクライアントサーバの構成であってもよい。
SoC101は、1個の集積回路チップ上に複数の異なる機能を有するように構成される。本実施形態において、SoC101はCPU(Central Processing Unit)102とGPU(Graphics Processing Unit)103を含むが、他の機能、例えば、無線ベースバンド処理部などを含んでいてもよい。
CPU102は、記憶部110、ROM104、またはRAM105に格納されたプログラムを実行することにより、情報処理装置100にて提供される各種処理を行う。すなわち、記憶部110等に格納されたプログラムは、本実施形態に係る情報処理装置100における処理を、CPU102に実行させるためのコードを含む。このコードにはOSのプログラム、アプリケーション用プログラム、ハードウェアを制御するためのドライバプログラムなどが含まれる。
GPU103は、リアルタイムの画像処理(描画処理)に特化した演算部であり、CPU102と比べて並列演算処理に優れている。例えば、GPU103は、画像処理を行うために、異なるパラメータを用いて、同一内容の処理を並列演算処理にて実行することが可能である。GPU103は、GPU103用専用のプログラム(以降、シェーダコードと呼ぶ)を実行することができる。シェーダコードは、GPU103が直接解釈可能な機械語列(データ形式)である。GPU103が直接解釈可能な機械語列は、GPU103が解釈可能な命令セットに基づいている。
ROM104は、情報処理装置100内部に用意された不揮発性のメモリである。CPU102が実行可能なプログラムやGPU103用のソースコード(以下、シェーダソース)が格納される。
より詳細にシェーダコードとシェーダソースの違いについて説明する。シェーダコードとは、GPU103が解釈可能な命令列である。ここでの「解釈可能」とは、GPU103が直接実行可能な機械語列であってもよいし、GPU103がその命令列を中間コードとして取り扱い、実行前に直接実行可能な機械語列に変換できる命令列であってもよい。一方、シェーダソースとは、GPU103を制御するためのAPI規格(例えば、OpenGL(登録商標) ES)によって定められたシェーダ言語によって記述されたソースコードである。シェーダ言語は特に限定するものではない。シェーダソースが、シェーダ言語に対応した所定のコンパイラによってコンパイルされることで、シェーダコードが生成可能である。シェーダの種類としては、例えば、頂点シェーダやフラグメントシェーダなどが挙げられる。
シェーダソースとシェーダコードの違いとして、シェーダコードはGPU103が直接実行可能である一方、シェーダソースはGPU103が直接実行できない点である。また、シェーダコードはGPU103(コンパイルを行ったコンパイラ)に依存した記述になっており、一般的には、あるGPU103のコンパイラにてコンパイルが行われたシェーダコードは他のGPU103では動作する保証がされない。一方、シェーダソースはGPU用コンパイラが記述に用いられたシェーダ言語に対応していれば動作するため、シェーダコードに比べて動作可能なGPUが多い点が違いとして挙げられる。言い換えると、シェーダソースは、シェーダコードに比べて実行可能なGPUの種類が多く、汎用性が高くなる。
RAM105は、各種の情報を記憶する読み書き可能な揮発性のメモリであり、CPU102のワークエリアとしても利用される。例えば、CPU102は、ROM104、または記憶部110に記憶されているプログラムをRAM105にロードしてプログラムを実行する。なお、情報処理装置100の機能及び後述するシーケンスに係る処理の全部又は一部については専用のハードウェアを用いて実現してもよい。また、本実施形態では、RAM105はSoC101には含まれない構成となっているが、高速化等のためにSoC101内部にRAM105が含まれていてもよい。また、RAM105は、GPU103用の領域のみSoC101に含まれて構成されてもよい。
データバス106は、各部位を相互に接続し、データ通信するために使用される配線である。入出力インターフェース107は、外部装置との入出力を制御する各種部位と、情報処理装置100内部との通信を制御する。本実施形態では、外部との入出力を制御する部位として、表示部108、外部入力部109、記憶部110、および通信部111が情報処理装置100に含まれる。
表示部108は、液晶等のディスプレイにより構成され、アプリケーションに関するUIや出力結果を表示する。外部入力部109は、ユーザからの各種入力を受け付ける。外部入力部109は、例えばマウス、キーボード、及びタッチパネル等の入力装置の少なくとも1つ以上を含んで構成される。外部入力部109は、ユーザからの入力に応じて、その入力内容を通知する通知情報をCPU102に出力する。または、外部入力部109は、RAM105に直接その通知情報を出力する。
記憶部110は、不揮発性の記憶領域であり、ファイルおよびプログラム等を格納可能なメモリ及びハードディスク等の記憶装置の少なくとも1つ以上を含む。または、記憶部110は、付け外し可能な可搬メディアであってもよい。通信部111は、情報処理装置100と他の情報処理装置との間で外部ネットワーク(不図示)を介して任意の情報を送受信する。通信部111は、例えばネットワークアダプタやアンテナを同梱する無線モジュール等の通信装置を含んで構成される。通信部111は、CPU102から他の情報処理装置に送信するために出力された情報を、ネットワークを介して他の情報処理装置に送信する。また、通信部111は、他の情報処理装置からネットワークを介して送信された情報を受信し、CPU102に出力する。
CPU102とGPU103の演算能力の特徴以外の違いについて説明する。いずれも解釈可能な機械語コードを実行する点は同じである。CPU102用の命令セットが一般に公開されている一方、GPU103用の命令セットは必ずしも公開されているとは限らないという点が異なる。これは、GPU103を制御するための規格(例えば、OpenGL ES)において、シェーダソースを事前にコンパイルするのではなく、実際にプログラムを実行する情報処理端末上でコンパイルすることが定められているためである。そのため、CPU102用の命令セットの種類に比べてGPU103の命令セットは多種多様である。特に、GPU103がGPU103用のAPI規格(例えば、OpenGL ES)にさえ対応すれば動作する環境では、アプリケーション開発時に具体的にどのGPU103の命令セットで動作するかを事前に把握することは極めて難しい。また、複数種類のGPUに対応させるために、それぞれに対応した複数のシェーダコードを命令セットに含めると、その数に応じて命令セットのサイズが増大してしまうという問題もある。
[ソフトウェア構成]
続いて、図2を用いて本実施形態に係るハードウェア上で動作するソフトウェアの構成例について説明する。本実施形態では、少なくとも1つ以上の画像演算処理等をGPU103で実行するようなアプリケーションを想定する。GPU103で実行するためのシェーダコードの基となるシェーダソースは、ROM104、または記憶部110に記憶されているものとする。さらに、使用する命令セットなど、構成の異なるGPU103向けにチューニングされたシェーダソースも、同様にROM104、または記憶部110に記憶されているものとする。ここでの「チューニング」とは、シェーダソースを特定のGPU103で高速に動作するように、基のシェーダソースが実現する機能は変更せずに、パフォーマンス向上のための施策を取り入れることを意味する。具体的には、ループ展開や、GPU103のレジスタ本数に適した変数の取り扱いの変更などが該当する。ここでは、あるシェーダソースを特定のGPU向けにチューニングすることで、当該シェーダソースとは異なるシェーダソースが構成されるものとする。特定のGPUは、そのGPU向けにチューニングされたシェーダソースを用いることで、チューニング前のシェーダソースよりも高いパフォーマンスを提供することが可能となる。
本実施形態では、GPUの種類に依存しないシェーダソースと、特定のGPU向けにチューニングされたシェーダソースとが同梱された命令セット(アプリケーション等)が情報処理装置100に配布されているものとして説明を行う。言い換えると、アプリケーションが配布時には、配布先となる情報処理装置100にどのような種類のGPUが備えられているかは、特定されていない。また、命令セットには、GPUアーキテクチャ属性に関する情報が含まれているものとする。この属性情報の詳細については、後述する。
RAM105には、GPUアクセス可能領域201が設けられる。GPUアクセス可能領域201は、GPU103が読み書き可能な領域である。スマートフォン等の小型端末ではCPU102とGPU103が使用するRAM105は共有になっていることが多い。そのため、本実施形態では、明確に、RAM105内にGPU103にとってアクセス可能な領域があるものとして説明を行う。なお、この構成に限定するものではなく、CPU102、GPU103向けの領域が混在するようなメモリ配置でもよいし、CPU102とGPU103が個別に使用可能なメモリが別々に用意された構成であってもよい。
CPU102は、アプリケーション制御部202、シェーダソース選択処理部203、シェーダコードキャッシュ処理部204、およびGPUドライバ205として機能する。これらの部位はそれぞれ、対応するプログラムをCPU102が読み出して実行することにより実現される。アプリケーション制御部202は、情報処理装置100を用いて実現したいアプリケーションを管理、制御する。シェーダソース選択処理部203は、チューニング前とチューニング後のシェーダソースの中から、実行を行う情報処理装置100上のGPU103に適したシェーダソースを選択する。
シェーダコードキャッシュ処理部204は、GPUドライバ205に取得要求を行い、コンパイル済みのシェーダコードを取得する。シェーダコードキャッシュ処理部204は、次回以降、コンパイル処理をスキップするために、取得したシェーダコードを不揮発メモリ(ROM104、または記憶部110)に保存しておき、利用時にはこの保存したシェーダコードの読み込みを行う。これにより、処理の負荷の低下や処理時間の短縮化が可能となる。
GPUドライバ205は、アプリケーション制御部202等のCPU102上の処理部からGPU103を制御するためのインターフェースとしての役割を持つ。GPUドライバ205の役割としては、シェーダソースをコンパイルしてシェーダコードへ変換することや、シェーダコードの実行をGPU103に指示することなどが挙げられる。シェーダソースコンパイル処理部206は、シェーダソースをコンパイルし、シェーダコードへ変換する。本実施形態において、シェーダソースコンパイル処理部206は主にCPU102上で動作するものとするが、コンパイル処理の一部をGPU103に受け渡すようにオフロードさせてもよい。または、GPUドライバ205がコンパイル指示を出すだけで、全てのコンパイル処理をGPU103に委譲させてもよい。GPU制御部207は、GPU103への命令実行指示および、GPU103が管理するテクスチャやレジスタの制御を行う。
記憶部110には、シェーダソース格納DB208、およびシェーダコード格納DB209が設けられる。シェーダソース格納DB208は、アプリケーション制御部202が使用するシェーダソースとシェーダソースに結び付けられた各種情報を含むデータベースである。シェーダソース格納DB208の具体的な内容は図5を用いて後述する。シェーダコード格納DB209は、GPUドライバ205のシェーダソースコンパイル処理部206が出力したシェーダコードをシェーダコードキャッシュ処理部204が格納する際に用いられるデータベースである。
GPU103は、シェーダコード実行部210、およびGPUキャッシュ管理部211として機能する。更に、GPU103には、GPUキャッシュ212が設けられる。シェーダコード実行部210は、GPU103の演算機能を用いて、GPU103が直接解釈可能なシェーダコードをGPU制御部207の指示に従って実行する。GPUキャッシュ管理部211は、GPU103のシェーダコード実行部210がシェーダコードを実行する際に、RAM105のGPUアクセス可能領域201よりも高速な読み書きが可能なGPUキャッシュ212にシェーダコードをキャッシュさせる。GPUキャッシュ212は、GPUキャッシュ管理部211によって管理される、シェーダコードとテクスチャデータを一時的に保管するためのGPU103に直結された高速なメモリ領域である。
[処理シーケンス]
次に、図3を用いて、本実施形態に係る処理シーケンスについて説明する。本処理シーケンスは、例えば、アプリケーション(不図示)を介してユーザから表示処理の要求を受け付けた際に、開始される。ここでは、CPU102、GPUドライバ205、およびGPU103が連携して処理を行う。
S301にて、アプリケーション制御部202は、アプリケーション(不図示)で使用するシェーダコードがシェーダコード格納DB209に存在するか否かを確認する。シェーダコードがシェーダコード格納DB209に存在しないことを確認した場合(S301にてNO)S400に遷移する。一方、シェーダコードがシェーダコード格納DB209内に存在した場合(S301にてYES)、すでに使用したいシェーダソースはコンパイル済みであることから、シェーダコンパイル処理をスキップし、S302に遷移する。つまり、コンパイル処理が行われたことにより生成されたシェーダコードがシェーダコード格納DB209に格納されていた場合、それ以降はコンパイル処理をスキップすることで、処理の負荷の低下や処理時間の短縮化が可能となる。
S400にて、シェーダソース選択処理部203は、チューニング前のシェーダソースとチューニング後のシェーダソースの中からパフォーマンスが好適なシェーダソースを選択し、コンパイルする。シェーダコンパイル処理の詳細については、図4を用いて後述する。本工程が完了した後、S302に遷移する。
S302にて、アプリケーション制御部202は、GPUドライバ205に対し、シェーダコード格納DB209に格納されている対象のシェーダコードを実行するように指示する。
S303にて、GPUドライバ205のGPU制御部207は、S302にてコンパイルするよう指示を受けた対象のシェーダコードを実行するように、GPU103に対して指示する。
S304にて、GPU103は、S303の指示にて指定されたシェーダコードをシェーダコード実行部210にて実行する。なお、本工程で用いられるシェーダコードは、GPUアクセス可能領域201に保持されている。そして、本処理シーケンスを終了する。
(シェーダコンパイル処理)
続いて、シェーダコンパイル処理について、図4を用いて詳細に説明する。
S401にて、シェーダソース選択処理部203は、GPU103に関する属性情報(GPUアーキテクチャ属性)を取得する。GPUアーキテクチャ属性とは、具体的には、GPUベンダー名や各GPUベンダーに依存するGPUチップの世代情報、更にはGPU103が対応している拡張機能およびテクスチャフォーマットの種類などが挙げられる。また、使用できるテクスチャの最大枚数と最大解像度などを、GPUアーキテクチャ属性として使用してもよく、上記に限定するものではない。GPU103のGPUアーキテクチャ属性に関する情報は、予めROM104等に保持しておき、CPU102がこれを取得するようにしてもよいし、GPUドライバ205を介してGPU103等に問い合わせを行うような構成であってもよい。
S600にて、シェーダソース選択処理部203は、コンパイル対象として使用するシェーダソースをチューニング前とチューニング後のシェーダソースから選択する。使用シェーダソース選択処理の詳細については、図6を用いて後述する。本工程が完了した後、S402に遷移する。
S402にて、シェーダソース選択処理部203は、使用シェーダソース選択処理(S600)にて選択したシェーダソースをコンパイルするように、GPUドライバ205に指示する。
S403にて、GPUドライバ205のシェーダソースコンパイル処理部206は、シェーダソース選択処理部203から指示された対象のシェーダソースをコンパイルし、シェーダコードを生成する。この時、本実施形態では、シェーダソースのコンパイルはGPUドライバ205で行うため、これを備えているCPU102がコンパイル処理を行うこととなる。しかし、コンパイル処理自体は、CPU102とGPU103が協働して行ってもよいし、または、GPU103が全てのコンパイル処理を行ってもよい。
S404にて、GPUドライバ205のシェーダソースコンパイル処理部206は、S403にて生成したシェーダコードをGPU103に記憶するよう、GPU103に指示する。このとき、シェーダソースコンパイル処理部206は、指示に併せて、生成されたシェーダコードをGPU103へ渡す。
S405にて、GPU103は、S404にて記憶するよう指示された対象のシェーダコードをRAM105内のGPUアクセス可能領域201に記憶する。
S406にて、CPU102のシェーダソース選択処理部203は、S405にてGPUアクセス可能領域201に記憶されたシェーダコードが取得可能か判定する。このような判定が必要な理由は、CPU102からも使用可能なRAM105内にシェーダコードが格納されていたとしても、GPUアクセス可能領域201はCPU102からの直接アクセスが禁止されていることが想定されるためである。そのため、シェーダソース選択処理部203は、GPUドライバ205にシェーダコードが取得可能か問い合わせ、その問い合わせ結果に基づいて判定を行う。シェーダコードが取得できないと判定された場合(S406にてNO)、本処理フローを終了し、図3のS302へ進む。シェーダコードが取得可能であると判定された場合(S406にてYES)、S407に遷移する。
S407にて、シェーダソース選択処理部203は、シェーダコードをGPUドライバ205から取得する。このとき、GPUドライバ205は、GPU103を介してRAM105のGPUアクセス可能領域201からシェーダコードを取得する。
S408にて、シェーダソース選択処理部203は、S407で取得したシェーダコードをシェーダコード格納DB209に保存する。そして、本処理フローを終了し、図3のS302へ進む。
(データ構成例)
次に、使用シェーダソース選択処理(S600)で参照するシェーダソース格納DB208の詳細について、図5を用いて説明する。
図5は、シェーダソース格納DB208において、基となるあるシェーダソースに対して、3つのチューニング済シェーダソースがあることを示している。それぞれのチューニング済シェーダソースには、それぞれを一意に識別するためのID(識別情報)がチューニングIDとして割り振られており、本実施形態ではチューニングID“1”〜“3”を示している。
シェーダソース格納DB208内には、チューニング済シェーダソースそのものの他に、GPUアーキテクチャ属性と呼ばれる、チューニング対象のGPU103に関する情報が含まれている。GPUアーキテクチャ属性は、シェーダソースをチューニングする際に、チューニングのターゲットとなるGPUアーキテクチャ向けの属性が、チューニングしたシェーダソースに付与される。つまり、GPUアーキテクチャ属性は、アプリケーションの配布前に事前に準備される。
図5に示すように、GPUアーキテクチャ属性は、具体的には、GPU103のベンダーおよびレンダラ(世代情報)、サポートするAPI(Application Programming Interface)のバージョン、およびサポートするシェーダ言語のバージョンなどが挙げられる。更に、GPUアーキテクチャ属性は、拡張機能(すなわちGPUを操作するAPIのコア機能以外の機能)のサポート情報を含んでいてもよい。他にも、GPUアーキテクチャ属性は、テクスチャに関する情報を含んでもよい。テクスチャに関する情報とは、例えば整数、浮動小数点数テクスチャフォーマットをサポートするか否か、サポートするテクスチャフォーマットの最大解像度などが挙げられる。
(使用シェーダソース選択処理)
続いて、使用シェーダソース選択処理(S600)について、図6を用いて詳細に説明する。
S601にて、CPU102のシェーダソース選択処理部203は、情報処理装置100に含まれるGPU103のGPUアーキテクチャ属性(以下、「実GPUアーキテクチャ属性」と呼ぶ)と一致するGPUアーキテクチャ属性に対応するチューニング済シェーダソースを、シェーダソース格納DB208から探索する。ここで、具体的な一致条件としては、シェーダソース格納DB208にて管理するGPUアーキテクチャ属性の項目全てが完全一致する場合としてもよい。また、別の一致条件として、GPU103のベンダー名およびレンダラ名のみを比較してよい。この条件は、全ての項目が完全一致するか否かという条件に比べて、異なるドライバのバージョンにより、同一のGPU103に対して細かな差が生じてしまうケースでも対応できるという効果がある。実GPUアーキテクチャ属性と一致するGPUアーキテクチャ属性に対応するチューニング済シェーダソースがシェーダソース格納DB208内に存在する場合(S601にてYES)S602に遷移する。一致するGPUアーキテクチャ属性に対応するチューニング済シェーダソースがシェーダソース格納DB208内に存在しない場合(S601にてNO)S603に遷移する。
S602にて、シェーダソース選択処理部203は、S601で一致したGPUアーキテクチャ属性に対応するチューニング済シェーダソースをアプリケーション(不図示)で使用するチューニング済シェーダソースとして選択する。そして、本処理フローを終了し、図4のS402へ遷移する。
S603にて、シェーダソース選択処理部203は、チューニング済シェーダソースに対応するGPUアーキテクチャ属性と実GPUアーキテクチャ属性との類似度を算出する。複数のチューニング済シェーダソースがシェーダソース格納DB208に存在する場合には、それぞれに対応するGPUアーキテクチャ属性と実GPUアーキテクチャ属性間の類似度が算出される。ここで、GPUアーキテクチャ属性間の類似度の算出方法としては、相関を算出する方法や、コサイン類似度、ユークリッド距離を算出する方法など、類似度を算出できる方法であればどのような方法でもよい。なお、文字列の類似度算出についても、使っている文字の種類を比較する方法や、編集距離(レーベンシュタイン距離)を求める方法であってもよい。ここでは、詳細な算出方法は省略する。
S604にて、シェーダソース選択処理部203は、算出したアーキテクチャ属性間の類似度のうち、最も高い類似度の値が採用最小類似度以上か否かを判定する。ここでの採用類似度の値は、予め規定され、記憶部110等に保持されているものとする。採用類似度は、例えば、類似度の算出に用いられる項目数や算出方法に応じて用いられる閾値である。シェーダソース選択処理部203は、最も高い類似度の値が採用最小類似度以上である場合(S604にてYES)S605に遷移し、採用最小類似度未満である場合(S604にてNO)S606に遷移する。
S605にて、シェーダソース選択処理部203は、最も高い類似度に対応するチューニング済シェーダソースをアプリケーションで使用するシェーダソースとして選択する。そして、本処理フローを終了し、図4のS402へ進む。
S606にて、シェーダソース選択処理部203は、チューニング前のシェーダソースをアプリケーションで使用するシェーダソースとして選択する。そして、本処理フローを終了し、図4のS402へ進む。
なお、本実施形態では、同一の機能を有する一つのシェーダを対象に記述している。アプリケーションが複数のシェーダを使用する場合は、あるシェーダをコンパイルする時に決定したチューニングIDを他のシェーダのコンパイル時に使用して、使用シェーダ選択処理(S600)をスキップしてもよい。または、各シェーダに対して、使用シェーダ選択処理(S600)を行ってもよい。
以上、本実施形態により、アプリケーションの配布先のGPU特性が特定できない場合でも、GPU上の処理の高速化を図ることが可能となる。
<第2の実施形態>
第1の実施形態における使用シェーダソース選択処理(S600)では、実GPUアーキテクチャ属性と、同梱された各チューニング済シェーダソースに対応するGPUアーキテクチャ属性との類似度を算出する方法を示した。ここで、算出した類似度を使用してパフォーマンスが向上するとして選択されたチューニング済シェーダソースを使用した場合に、チューニング前シェーダソースを実行した時よりもパフォーマンスが悪化してしまう可能性がある。そこで、本実施形態では、第1の実施形態の手法を用いてパフォーマンスが悪化してしまうケースを防ぎ、かつシェーダソース選択処理に要する時間を短くする方法を示す。
[処理シーケンス]
(シェーダコンパイル処理)
図7を用いて、本実施形態に係るシェーダコンパイル処理について説明する。図7は、第1の実施形態にて説明した図4のシェーダコンパイル処理に対応し、ここでは差異部分のみ説明する。図4と同じ内容の処理については、同じ参照番号を付す。
S401にて実GPUアーキテクチャ属性を取得後、S800にて、シェーダソース選択処理部203は、パフォーマンスチェックを伴う使用シェーダソース選択処理を行う。本工程の詳細については、図8を用いて後述する。本工程の処理の後、S701へ進む。
S701にて、シェーダソース選択処理部203は、使用シェーダソース選択処理(S800)で選択されたシェーダソースがコンパイル済みか否かを判定する。選択されたシェーダソースがコンパイル済みであると判定された場合(S701にてYES)S406へ遷移する。一方、選択されたシェーダソースが未だコンパイルされていないと判定された場合(S701にてNO)S402へ遷移する。以降の処理は、第1の実施形態の図4と同等の処理となるため、詳細な説明は省略する。
(使用シェーダソース選択処理)
続いて、本実施形態に係る使用シェーダソース選択処理について、図8を用いて詳細に説明する。図8は、第1の実施形態にて説明した図6のシェーダコンパイル処理に対応し、ここでは差異部分のみ説明する。図8と同じ内容の処理については、同じ参照番号を付している。なお、第1の実施形態の使用シェーダソース選択処理では、CPU102が処理主体となっていたが、本実施形態では、更にGPUドライバ205、GPU103が連携して本処理を行う。
S603の処理の後、S801にて、シェーダソース選択処理部203は、S603にて算出した類似度を使用して、類似度の高い順に一定数チューニング済シェーダソースを選択する。例えば、一定数のチューニング済シェーダソースが類似度の高い順に並べられたリストを生成するような構成であってもよい。また、ここでの一定数として用いられる値は予め規定され、記憶部110等に保持されていてよい。なお、チューニング済シェーダソースの類似度が所定の閾値以下である場合には、上記一定数に満たない場合でも、所定の閾値以下の類似度のチューニング済シェーダソースは選択対象としないような構成であってもよい。
S802にて、シェーダソース選択処理部203は、S801にて選択したチューニング済シェーダソースとチューニング前シェーダソースを、シェーダコード出力のためにコンパイルするよう、GPUドライバ205に指示する。
S803にて、GPUドライバ205のシェーダソースコンパイル処理部206は、シェーダソース選択処理部203から指示された全てのシェーダソースをコンパイルする。
S804にて、シェーダソースコンパイル処理部206は、S803にて生成したシェーダコードをGPU103に記憶するよう、GPU103に指示する。このとき、シェーダソースコンパイル処理部206は、生成したシェーダコードをGPU103へ渡す。
S805にて、GPU103は、GPUドライバ205から記憶するよう指示された全てのシェーダコードをRAM105内のGPUアクセス可能領域201に記憶する。指示されたシェーダコードの記憶が完了した後、GPU103は、その旨をCPU102へ通知する。
本実施形態では、チューニング済シェーダソースとチューニング前シェーダソースをまとめてS803の工程で生成している。しかし、GPU103が利用可能なRAM105のサイズを鑑みて、以降のパフォーマンスチェックの処理までコンパイルするシェーダソースを分割、または個別にコンパイルしてもよい。
S806にて、シェーダソース選択処理部203は、生成したチューニング前およびチューニング後シェーダソースに対応するシェーダコードを使用してパフォーマンスチェックを行う。シェーダソース選択処理部203はその中で最もパフォーマンスが好適なシェーダコードを、以降の処理で使用するものとして選択する。ここでのパフォーマンスチェックの方法は特に限定するものではなく、各シェーダソースに適用可能な方法であればよい。例えば、所定の処理を実行させ、その処理に要する時間や消費するリソースなどを基準として判定してよい。また、パフォーマンスに対する評価は、所定の閾値を用いた絶対評価でもよいし、各シェーダソース間の相対評価であってもよい。そして、本処理フローを終了し、図7のS701へ進む。
ここで、図8に示す使用シェーダソース選択処理の流れについて、主にデータの流れの視点から図9を用いて説明する。図9は、シェーダソース格納DB208内に5つのチューニング済シェーダソースがある例を示している。まず、シェーダソース選択処理部203がS801で類似度の高い順に一定数のチューニング済シェーダソースを選択する。図9では、上位3つのチューニング済シェーダソースを選択している。図9では、類似度の高いチューニング済シェーダソースを選択するためにソート処理を行っているが、必ずしも不要な部分までソートする必要は無く、単に類似度が上位から所定数のチューニング済シェーダソースを取得できれば他の方法でもよい。
図9では、パフォーマンスチェック対象のシェーダソースとして、チューニングID“5”,“2”,“3”3つのチューニング済シェーダソースに加え、チューニング前シェーダソースを含めている。結果、図9の例であれば、シェーダソース選択処理部203は、パフォーマンスチェックで対象となるシェーダソースを4つに絞っている。
なお、チューニング済シェーダソースの選択数の増加は、パフォーマンスチェックに要する時間の増加に繋がる。そのため、使用するシェーダの種類の数や経過時間に応じて、動的にパフォーマンスチェックに用いるシェーダコードの数を増減させてもよい。
以上、本実施形態により、第1の実施形態の効果に加え、パフォーマンスが悪化してしまうケースを防ぐことができる。同時に、パフォーマンスチェックに要する時間を極力短くし、ユーザビリティに与える影響を少なくすることが可能となる。
<第3の実施形態>
第1の実施形態に係る使用シェーダソース処理(S400)では、実GPUアーキテクチャ属性と、同梱された各チューニング済シェーダソースに対応するGPUアーキテクチャ属性との類似度を算出する方法を示した。しかし、類似度を使用してパフォーマンスの向上を想定して選択されたチューニング済シェーダソースを使用した場合に、チューニング前シェーダソースを実行した時よりもコンパイル後のシェーダコードの命令長が長くなってしまう場合がある。これは、ソースコードのチューニング処理として行われる、ループ展開やインライン関数展開などがコンパイル後のシェーダコードのサイズを大きくする方向に作用する場合があるためである。
一方、GPU103は、処理できるシェーダコードの大きさである最大命令長には上限がある。また、シェーダコードの大きさである最大命令長は、GPU103によって異なる。最大命令長を超えてしまう場合、GPUドライバ205は、シェーダソースコンパイル処理部206の処理でコンパイル不可として通知してしまうことが考えられる。また、コンパイルにより生成されたシェーダコードが、GPUキャッシュ212が格納可能な最大キャッシュ長に収まらない場合がある。この場合、動作が極端に遅くなる、または、GPU103の出力結果が最大キャッシュ長に収まった場合とは異なってしまう可能性がある。
そこで、本実施形態では、最大命令長または最大キャッシュ長を超えた場合を考慮した上で、使用するシェーダソースを選択する方法を示す。以下のフローチャートでは、最大命令長を考慮した例を示すが、命令キャッシュ長についても同様の処理を適用することが可能である。
[処理シーケンス]
(シェーダコンパイル処理)
図10を用いて、本実施形態に係るシェーダコンパイル処理について説明する。図10は、第1の実施形態にて説明した図4のシェーダコンパイル処理に対応し、ここでは、差異部分のみ説明する。図4と同じ内容の処理については、同じ参照番号を付す。
S403でシェーダコードを生成した後、S1001にて、GPUドライバ205は、生成したシェーダコードの大きさが、GPU103の最大命令長を超えるか否かを判定する。ここでのGPU103の最大命令長の情報は予め取得していてもよいし、GPU103に問い合わせを行うような構成であってもよい。シェーダコードの大きさが最大命令長以上の場合には(S1001にてYES)S1002に遷移する。一方、シェーダコードの大きさが最大命令長未満の場合には(S1001にてNO)S404に遷移する。S404以降の処理は第1の実施形態にて説明した内容と同じため、ここでの説明は省略する。
S1002にて、シェーダソース選択処理部203は、S403でコンパイルしたシェーダソースがチューニング前シェーダソースか否かを判定する。シェーダソースがチューニング前シェーダソースである場合(S1002にてYES)S1004に遷移する。一方、シェーダソースがチューニング後シェーダソースである場合(S1002にてNO)S1003に遷移する。
S1003にて、シェーダソース選択処理部203は、複数のチューニング前シェーダソースのうち、シェーダコードの大きさがより小さくなると想定されるチューニング前シェーダソースを選択する。つまり、シェーダコードのサイズに対する圧縮効果が高いシェーダソースを選択する。ここでの選択方法は、例えば、コンパイル前のシェーダソースのサイズを比較し、その比較結果に基づいて選択してもよい。未処理のチューニング前シェーダソースが1つしかない場合には、そのシェーダソースコードが選択されることとなる。そして、S402へ遷移する。これにより、シェーダソース選択処理部203は、チューニング前シェーダソースを使用して、もう一度、コンパイルを試みることとなる。なお、複数の使用シェーダソースが選択されていた場合、シェーダコードの長さが最大命令長を下回るまで、もしくは、全ての使用シェーダソースに対する処理が完了するまで、チューニング前シェーダソースへの置換が繰り返されることとなる。
S1004にて、シェーダソース選択処理部203は、選択されたシェーダソースに対してこれ以上命令語長を短くすることはできないものとして、コンパイル不可と判定する。そして、本処理フローを終了し、図3のS302へ進む。コンパイル不可と判定された場合には、例えば、所定のエラーや警告がユーザに表示されるように構成されてよい。
以上、本実施形態により、シェーダコードが最大命令長または最大キャッシュ長を超えた場合を考慮した上で、使用するシェーダソースを選択することができる。そのため、GPU103が処理できない命令長のチューニング済シェーダソースであった場合にも、より命令長の短いシェーダソースを選択し、処理を続行可能となる。
<その他の実施形態>
本発明は、上述の実施形態の1以上の機能を実現するプログラムを、ネットワーク又は記憶媒体を介してシステム又は装置に供給し、そのシステム又は装置のコンピュータにおける1つ以上のプロセッサーがプログラムを読出し実行する処理でも実現可能である。また、1以上の機能を実現する回路(例えば、ASICやFPGA)によっても実現可能である。
100…情報処理装置、101…SoC、102…CPU、103…GPU、104…ROM、105…RAM、110…記憶部、111…通信部、201…GPUアクセス可能領域、202…アプリケーション制御部、203…シェーダソース選択処理部、204…シェーダコードキャッシュ処理部、205…GPUドライバ、206…シェーダソースコンパイル処理部、207…GPU制御部、208…シェーダソース格納DB、209…シェーダコード格納DB、210…シェーダコード実行部、211…GPUキャッシュ管理部、212…GPUキャッシュ

Claims (11)

  1. GPU(Graphics Processing Unit)を備える情報処理装置であって、
    第1のソースコードと、前記第1のソースコードを複数種類のGPUそれぞれ向けにチューニングした複数の第2のソースコードと、前記複数の第2のソースコードそれぞれに対応するGPUの属性情報とを含んで構成された命令セットを取得する取得手段と、
    前記GPUの属性情報に基づいて、前記命令セットに含まれる前記第1のソースコードおよび前記複数の第2のソースコードの中から、前記GPUに実行させるソースコードを選択する選択手段と、
    前記選択手段にて選択されたソースコードを前記GPUが解釈可能なデータ形式にコンパイルするコンパイル手段と、
    前記コンパイル手段にてコンパイルされたコードを前記GPUに実行させる制御手段と
    を有することを特徴とする情報処理装置。
  2. 前記コンパイル手段にてコンパイルされたコードをキャッシュするキャッシュ手段を更に有し、
    前記制御手段は、前記キャッシュ手段にてキャッシュされたコードを用いて、前記GPUによる次回以降の処理を実行させることを特徴とする請求項1に記載の情報処理装置。
  3. 前記選択手段は、前記GPUに対応した第2のソースコードが前記命令セットに含まれる場合には、当該GPUに対応した第2のソースコードを選択することを特徴とする請求項1または2に記載の情報処理装置。
  4. 前記GPUの属性情報と、前記複数の第2のソースコードそれぞれに対応する複数種類のGPUそれぞれの属性情報との類似度を算出する算出手段を更に備え、
    前記選択手段は、前記GPUに対応した第2のソースコードが前記命令セットに含まれない場合、前記複数の第2のソースコードのうち、最も類似度が高い第2のソースコードを選択することを特徴とする請求項1乃至3のいずれか一項に記載の情報処理装置。
  5. 前記GPUの属性情報と、前記複数の第2のソースコードそれぞれに対応する複数種類のGPUそれぞれの属性情報との類似度を算出する算出手段を更に備え、
    前記選択手段は、前記GPUに対応した第2のソースコードが前記命令セットに含まれない場合、類似度が高い順の所定数の第2のソースコードに対し処理のパフォーマンスのチェックを行い、最もパフォーマンスの高い第2のソースコードを選択することを特徴とする請求項1乃至3のいずれか一項に記載の情報処理装置。
  6. 前記選択手段にて第2のソースコードが選択され、かつ、前記コンパイル手段にて当該第2のソースコードをコンパイルした結果、前記GPUの最大命令長もしくは命令キャッシュ長を超える場合、前記選択手段は、前記第1のソースコードを選択しなおすことを特徴とする請求項1乃至5のいずれか一項に記載の情報処理装置。
  7. 前記コンパイル手段および前記制御手段は、前記GPUに対応するGPUドライバに設けられることを特徴とする請求項1乃至6のいずれか一項に記載の情報処理装置。
  8. GPU(Graphics Processing Unit)を備える情報処理装置の制御方法であって、
    第1のソースコードと、前記第1のソースコードを複数種類のGPUそれぞれ向けにチューニングした複数の第2のソースコードと、前記複数の第2のソースコードそれぞれに対応するGPUの属性情報とを含む命令セットを取得する取得工程と、
    前記GPUの属性情報に基づいて、前記命令セットに含まれる前記第1のソースコードおよび前記複数の第2のソースコードの中から、前記GPUに実行させるソースコードを選択する選択工程と、
    前記選択工程にて選択されたソースコードを前記GPUが解釈可能なデータ形式にコンパイルするコンパイル工程と、
    前記コンパイル工程にてコンパイルされたコードを前記GPUに実行させる制御工程と
    を有することを特徴とする情報処理装置の制御方法。
  9. GPU(Graphics Processing Unit)を備えるコンピュータを、
    第1のソースコードと、前記第1のソースコードを複数種類のGPUそれぞれ向けにチューニングした複数の第2のソースコードと、前記複数の第2のソースコードそれぞれに対応するGPUの属性情報とを含む命令セットを取得する取得手段、
    前記GPUの属性情報に基づいて、前記命令セットに含まれる前記第1のソースコードおよび前記複数の第2のソースコードの中から、前記GPUに実行させるソースコードを選択する選択手段、
    前記選択手段にて選択されたソースコードを前記GPUが解釈可能なデータ形式にコンパイルするコンパイル手段、
    前記コンパイル手段にてコンパイルされたコードを前記GPUに実行させる制御手段
    として機能させるためのプログラム。
  10. 前記コンパイル手段、および前記制御手段は、前記GPUに対応するGPUドライバにて構成されることを特徴とする請求項9に記載のプログラム。
  11. 前記取得手段、前記選択手段、前記コンパイル手段、および、前記制御手段は、前記コンピュータが備えるCPU(Central Processing Unit)により実行されるプログラムとして構成されることを特徴とする請求項9または10に記載のプログラム。
JP2018099796A 2018-05-24 2018-05-24 情報処理装置及びその制御方法、並びにプログラム Pending JP2019204348A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2018099796A JP2019204348A (ja) 2018-05-24 2018-05-24 情報処理装置及びその制御方法、並びにプログラム
US16/413,786 US10957006B2 (en) 2018-05-24 2019-05-16 Information processing device and method of controlling same, and non-transitory computer readable medium

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2018099796A JP2019204348A (ja) 2018-05-24 2018-05-24 情報処理装置及びその制御方法、並びにプログラム

Publications (1)

Publication Number Publication Date
JP2019204348A true JP2019204348A (ja) 2019-11-28

Family

ID=68613751

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2018099796A Pending JP2019204348A (ja) 2018-05-24 2018-05-24 情報処理装置及びその制御方法、並びにプログラム

Country Status (2)

Country Link
US (1) US10957006B2 (ja)
JP (1) JP2019204348A (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117152320A (zh) * 2023-02-15 2023-12-01 荣耀终端有限公司 图像处理方法和电子设备

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7564460B2 (en) 2001-07-16 2009-07-21 Microsoft Corporation Systems and methods for providing intermediate targets in a graphics system
US11243816B2 (en) * 2014-03-30 2022-02-08 UniversiteitGent Program execution on heterogeneous platform
US9569811B2 (en) * 2014-06-26 2017-02-14 Qualcomm Incorporated Rendering graphics to overlapping bins
US10452409B2 (en) * 2015-10-23 2019-10-22 Oracle International Corporation Universal adapter for native calling

Also Published As

Publication number Publication date
US10957006B2 (en) 2021-03-23
US20190362459A1 (en) 2019-11-28

Similar Documents

Publication Publication Date Title
US11106504B2 (en) Application interface on multiple processors
US10552226B2 (en) Data parallel computing on multiple processors
US10067797B2 (en) Application programming interfaces for data parallel computing on multiple processors
US8225325B2 (en) Multi-dimensional thread grouping for multiple processors
EP2140352B1 (en) Parallel runtime execution on multiple processors
US9747084B2 (en) Offline shader compilation
EP3413198A1 (en) Data parallel computing on multiple processors
US20080276064A1 (en) Shared stream memory on multiple processors
US20140189708A1 (en) Terminal and method for executing application in same
US9870042B2 (en) Apparatus and method managing power based on data
US20150348224A1 (en) Graphics Pipeline State Object And Model
CN115934102B (zh) 通用寄存器动态分配方法、装置、计算机设备和存储介质
JP2019204348A (ja) 情報処理装置及びその制御方法、並びにプログラム
US20220100499A1 (en) Performance enhancement for application development utilizing smart runtime analyzer and advisor
CN112230931B (zh) 适用于图形处理器的二次卸载的编译方法、装置和介质
Kuo et al. The design of LLVM-based shader compiler for embedded architecture
JP5190899B2 (ja) 情報処理装置、設定ファイル生成方法、および設定ファイル生成プログラム
CN116932206A (zh) 文件处理方法、装置、计算机设备和存储介质
KR20180052919A (ko) 프로그램 코드 통합 처리를 위한 장치 및 방법

Legal Events

Date Code Title Description
RD01 Notification of change of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7421

Effective date: 20210103

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20210113