[ブログに戻る](/ja/blog) # マルチスレッドでの作業

Vadim Asandiy 5月 26, 2023

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

マルチスレッドでのロードと再生成のために、BimNv SDK は Intel® oneAPI Threading Building Blocks (oneTBB) ライブラリを使用します。

### マルチスレッドでのロード

デフォルトでは、スレッド数は ODA スレッドプールから取得されます。しかし、マルチスレッドモードでファイルをロードする際にスレッド数を設定する必要がある場合は、OdDbBaseHostAppServices のメソッド virtual int numThreads(OdDb::MultiThreadedMode mtMode) をオーバーライドします。例:

```
//…
class MyServices : public OdNwHostAppServices
{
  //…  
  //method for setting thread count
  void setNumThreads(int numThreads)
  {
    m_numThreads = numThreads;
  }

  // override method for getting thread count
  int numThreads(OdDb::MultiThreadedMode mtMode) override
  {
    int numThrs = 1;
    bool bEnabled = false;
    switch (mtMode)
    {
      case OdDb::kMTLoading:
      bEnabled = GETBIT(getMtMode(), 1);
      break;
    }
    if (bEnabled)
      numThrs = m_numThreads;
      return numThrs;
  }

  protected:
    int m_numThreads;
};
//…
```

マルチスレッドモードでファイルを開くには、以下のコードを使用します。

```
//…
OdNwHostAppServices* pHostApp;
OdString nwFile;
//…
OdInt16 nMode = pHostApp->getMtMode();

//set mt loading mode
SETBIT_1(nMode, 1);
pHostApp->setMtMode(nMode);
MyServices* pMyHostApp = dynamic_cast<MyServices*>(pHostApp);

//if our pHostApp contain override method for thread count's getting – then set 8 threads, for example
if (pMyHostApp != nullptr)
  pMyHostApp->setNumThreads(8);
OdNwDatabasePtr pDb = pHostApp->readFile(nwFile);
//… 
```

以下の表は、シングルスレッドモードと比較した場合のマルチスレッドロードにおける時間短縮を示しています。

| | 部分ロード | 部分ロード | 部分ロード | 全体ロード | 全体ロード | 全体ロード |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| | st vs mt2 | st vs mt4 | st vs mt8 | st vs mt2 | st vs mt4 | st vs mt8 |
| 平均 <br> 改善 | -9% | -20% | -16% | -7% | -35% | -38% |

### マルチスレッドでの再生成

Gi/Gs ベクトル化を使用しながらマルチスレッドで再生成を行う場合、スレッド数を GS デバイスプロパティとして設定できます。

```
//...
OdNwHostAppServices* pHostApp;
OdGsDevicePtr pDevice;
OdString nwFile;
OdUInt32 mtRegenThreadCnt;
//...
OdNwDatabasePtr pDb = pHostApp->readFile(nwFile);
//...
// Initialize GsDevice and set additional properties to GiContext
//...
OdRxDictionaryPtr devProperties = pDevice->properties();
devProperties->putAt(OD_T("EnableMultithread"), OdRxVariantValue(true));
devProperties->putAt(OD_T("MaxRegenThreads"), OdRxVariantValue(static_cast<OdUInt16>(mtRegenThreadCnt)));
//…
//now update of Gs device is going in mt-regen mode
pDevice->update();
//...
```

オフスクリーンベクトル化デバイスの場合、GS デバイスプロパティ ForcePartialUpdate を true に設定します。

```
//…
devProperties->putAt(OD_T("ForcePartialUpdate"), OdRxVariantValue(true));
//…
```

以下の表は、シングルスレッドモードと比較した場合のマルチスレッド再生成における時間短縮を示しています。

| | st vs mt2 | st vs mt4 | st vs mt8 |
| :---: | :---: | :---: | :---: |
| 平均 <br> 改善 | -28% | -45% | -42% |

以下のハードウェアが統計取得に使用されました。

- Intel® Core™ i7-6700 CPU @ 3.40GHz; 1 ソケット、4 コア、8 論理プロセッサ
- 32GB RAM、速度 2133MHz
- HDD

[弊社のドキュメント](https://docs.opendesign.com/bimnv/bimnv_working_with_multi-threading.html)で詳細をご覧ください。

## 今すぐ始める

**ODAソフトウェアを60日間無料でお試しください。  
リスクなし、クレジットカード不要。**

[無料で試す](https://www.opendesign.com/ja/free-trial)
