2017-02-05 61 views
3

是否可以在OpenACC區域中使用bitset的功能? 一個例子的代碼:我可以在OpenACC中使用std :: bitset的函數嗎?

#include <string.h> 
#include <bitset> 

#pragma acc routine seq 
int mystrcmp (const char *, const char *); 
int main(int argc, char** argv) 
{ 
    long sum = 3, i; 
    std::bitset<11> vv; 
    char *str; 
    char *str2; 

    #pragma acc parallel loop reduction(+:sum) 
    for(i = 0; i<5000000000; ++i) 
    { 
     sum +=i%2; 
     if(i == 1){ 
      mystrcmp(str, str2); 
      vv.count(); 
     } 
    } 
    return 0; 
} 
int mystrcmp (const char *s1, const char *s2) {...} 

如果我編譯上面pgc++ -fast -acc -Minfo=accel -ta=nvidia:managed -DNDEBUG -pgc++libs -g和同類者(LD_LIBRARY_PATH = /選擇/ PGI/linux86-64/lib中)的代碼,我得到以下錯誤:PGCC-S-0155-PGI support procedure called within a compute region: __blt_pgi_popcountl (proba2.cpp: 1288) PGCC-S-0155-Accelerator region ignored; see -Minfo messages (proba2.cpp: 28) main: 28, Accelerator region ignored 1288, Accelerator restriction: unsupported call to support routine '__blt_pgi_popcountl' PGCC/x86 Linux 16.10-0: compilation completed with severe errors,但代碼由更少的線,比1288.
我使用mystrcmp,因爲內置strcmp需要routine seq,但根據我所知,這是不可能解決的。
但是,如果vv.count()被註釋掉,那麼編譯就是成功。
我讀了很多關於OpenACC和OpenACC的問題,但我沒有找到相應的迴應。
我該怎麼辦?

回答

2

不,對不起,但我們(PGI)沒有爲「std :: bitset」例程添加運行時支持。由於這是我對該功能的第一個請求,我提交了一個新的RFE(TPR#23746),並將它發送給我們的編譯器工程師,以瞭解我們可以做什麼。

+0

感謝您的回覆。我也想問一下,pgC++編譯器是否支持<<運算符來使用並行區域?因爲我不認爲。 – fokhagyma

+0

二進制移位運算符應該正常工作。你有看到問題的例子嗎? –

+0

好的。我問了一個錯誤的問題。 <<像我認爲的重載操作符。例如:std :: string str =「something」; #pragma acc kernels for(unsigned short int count = 1; count <= size; count ++){std :: cout << str;然後編譯器需要例程信息。 – fokhagyma

相關問題