2017-01-05 33 views
0

當我試圖編譯我的代碼在OpenACC的,它會報告:報告PGCC-S-0000-內部錯誤而沒有堆分配

PGCC-S-0000-Internal compiler error. Call in OpenACC region to support routine - _mp_malloc (/home/lisanhu/mine/ws/C/AccSeqC/as_align.cc: 92) 
PGCC-S-0155-Compiler failed to translate accelerator region (see -Minfo messages) (/home/lisanhu/mine/ws/C/AccSeqC/as_align.cc: 92) 
inexact_dfs_iter_search(const char *, long, long, const long *, const long *, long, const char *, const long *, const char *, acc_range *, int): 
    92, Generating acc routine seq 
     93, Accelerator restriction: unsupported call to support routine '_mp_malloc' 

雖然報告功能定義如下:

int 
inexact_dfs_iter_search(const char *query, const array_size q_length, array_size allowed_diffs, 
         const array_size *c, const array_size *o, array_size r_length, 
         const char *ref_bwt, const array_size *rev_o, const char *rev_bwt, 
         Range *res, int num_of_res) { 
    array_size d[q_length]; 
    calculateD(query, q_length, r_length, c, rev_o, rev_bwt, d); 
// for (int i = 0; i < q_length; ++i) { 
//  cout << d[i]; 
// } 
// cout << endl; 
// cout << strndup(query, q_length) << endl; 
    Profile p{q_length - 1, 1, r_length - 1, allowed_diffs}; 
    int prof_size = 9 * q_length + 1; 
    Profile profs[prof_size]; 
    Stack<Profile> profiles(profs, prof_size); 
    profiles.push(p); 

    Heap<Range> results(res, num_of_res); 
    while (!profiles.empty() && !results.full()) { 
     if (profiles.full()) { 
      return 1; 
     } 
//  p = profiles.peek(); 
     p = profiles.pop(); 
     inex_dfs_process_profile(query, p, c, o, ref_bwt, d, profiles, results); 
    } 
    return 0; 
} 

線92是5日線(函數定義它的一部分,所以怪)

我會很感激,如果有人可以幫我一下吧。

回答

0

我找到了原因。對於array_size d[q_length];,它實際上調用_mp_malloc在堆棧上分配內存。我試圖將q_length替換爲常量,並且工作正常。 (儘管這是一個暫時的調整,但我終於找到了他的理由)

+0

對不起,三胡李,但我們還不支持設備代碼中的VLA。當然,我們不應該給ICE,而應該給出錯誤信息。請向PGI客戶服務([email protected])發送一份說明,我們會進行調查。 –