2

私のコードでは、いくつかの大きな配列を割り当てる必要があります。

ただし、IBM xlc_r を使用しようとすると:

xlc_r -g -O -L. -qarch=pwr7 -qtune=pwr7 -lesslsmp -lm -qsmp -qthreaded -qmaxmem=-1 2.c

int main()
{
     int natom = 5000;
     while(1)
     {
        double *z =(double*) malloc(natom*natom*natom* sizeof(double));
        if(!z)
        {  
           printf("error memory vector z\n\n");
           exit(-1);
        }
     }
}

Killed an error for memory vector z のいずれかを受け取ります。

これは次のulimit -aとおりです。

core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max memory size         (kbytes, -m) unlimited 
open files                      (-n) 102400   
pipe size            (512 bytes, -p) 64   
stack size              (kbytes, -s) unlimited   
cpu time               (seconds, -t) unlimited   
max user processes              (-u) 128  
virtual memory          (kbytes, -v) unlimited

より多くのメモリを割り当てるために必要なフラグはありますか?

4

1 に答える 1

2

しばらく前に、POWER775 AIX マシンでこの問題に遭遇しました。-q642GiB を超えるメモリを割り当てるには、コンパイル時にフラグを追加する必要があります。使用に関する他のユーザーのコメントはint、コードに関連している可能性があることに注意してください。これが、以下の例で を使用する理由size_tです。

これを調査するために、割り当ての簡単なテストを実行することをお勧めします。この状況のた​​めに書いた私のテスターは以下のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char * argv[])
{
    size_t max = (argc>1) ? (size_t)atol(argv[1]) : ((size_t)256*1024)*((size_t)1024*1024);
    for (size_t n=1; n<=max; n*=2) {
        printf("attempting malloc of %zu bytes \n", n);
        fflush(0);
        void * ptr = malloc(n);
        if (ptr==NULL) {
            printf("malloc of %zu bytes failed \n", n);
            fflush(0);
            return 1;
        } else {
            printf("malloc of %zu bytes succeeded \n", n);
            fflush(0);
            memset(ptr,0,n);
            printf("memset of %zu bytes succeeded \n", n);
            fflush(0);
            free(ptr);
        }
    }
    return 0;
}

関連するビルド フラグは次のとおりです。

ifeq ($(TARGET),POWER7-AIX)
# Savba i.e. POWER775 AIX
    CC       = mpcc_r
    OPT      = -q64 -O3 -qhot -qsmp=omp -qtune=pwr7 -qarch=pwr7 -qstrict
    CFLAGS   = $(OPT) -qlanglvl=stdc99
endif
于 2016-02-23T03:56:34.680 に答える