インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

コプロセッサーのスタックサイズの設定

このトピックは、インテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャーをターゲットとする場合にのみ適用されます。

コードをオフロードする各 CPU スレッドは、その CPU スレッド専用のコプロセッサー・スレッドでオフロードコードを実行します。これらのコプロセッサー・スレッドのデフォルトのスタックサイズは 2MB です。

オフロードコードに割り当てるスタックサイズを増やすには、環境変数 MIC_STACKSIZE に割り当てるサイズを設定します。MIC_STACKSIZE は常に有効です。変数 MIC_ENV_PREFIX が設定されている必要はありません

MIC_STACKSIZE の値は次のように指定します。

integerB

値 (バイト単位)。

integerK

値 (キロバイト単位)。

integerM

値 (メガバイト単位)。

integerG

値 (ギガバイト単位)。

integerT

値 (テラバイト単位)。

例えば、次の BASH、Dash、および C シェルコマンドは、メインのコプロセッサー・スレッドの最大スタックサイズを 50MB に設定します。

export MIC_STACKSIZE=50M    #(Bash または Dash シェル)
setenv MIC_STACKSIZE 50M    #(C シェル)

OpenMP* およびインテル® Cilk™ Plus ランタイム・ライブラリーには、追加の OpenMP* またはインテル® Cilk™ Plus スレッドで使用するスタックのサイズを調整する環境変数が用意されています (インテル® Cilk™ Plus は古い機能 (非推奨) です)。MIC_STACKSIZE は、これらのスレッドには適用されません。例えば、BASH または Dash シェルでメインスレッドを除く各 OpenMP* スレッドのスタックサイズを 3MB にするには、次のように入力します: export OMP_STACKSIZE=3M (ホストとコプロセッサーの両方の OpenMP* スレッドに影響します) または export MIC_ENV_PREFIX=ABC export ABC_OMP_STACKSIZE=3M (コプロセッサーの OpenMP* スレッドにのみ影響します)。

pthreads を使用する場合は、下位に追加のガードページとページ境界のスタック (4096 バイト・ページ) を割り当てる posix_memalign() を使用して pthreads のスタックサイズを設定した後、そのスタックを pthread_attr_setstack() に渡します。次に、pthread_create()pthread_attr_setstack() を使用します。次のコードは、この手法を示しています。

#define PAGESIZE 4096

void *makestack(int size) {
    int ret;
    void *space;
    char *stack;

    /* size in pages */
    ret = posix_memalign(&space, PAGESIZE, (size+1) * PAGESIZE);
    if (ret != 0) {
        fprintf(stderr, "posix_memalign returns %d\n", ret);
        return 0;
    }

    mprotect(space, PAGESIZE, PROT_NONE);
    stack = (char *)space + PAGESIZE;
    printf("makestack: size %d stack %p space %p\n",
        size, stack, space);
    return stack;
}

void setstack(int argc, char **argv) {
    void *i;
    pthread_t t;
    int ret;
    const int stacksize = (12 * 1024 * 1024) / PAGESIZE;

    pthread_attr_init(&thread_attrs);
    pthread_attr_setstack(&thread_attrs,
        makestack(stacksize), stacksize * PAGESIZE);
    pthread_create(&t, &thread_attrs, chkstack, (void *)stacksize);
}

関連情報