2017-03-02 175 views
0

在OpenMP中,人們可以通過共享變量和OpenACC的

#pragma omp parallel for shared(foo) private(bar) 

使用共享在一個循環變量在OpenACC的,我們有一個private條款,但沒有shared子句。另一方面有數據條款,如copy,copyin,copyout

有時,我們使用加速器,它們有自己的私有內存,但也可以訪問公用內存。

在這種情況下,我們可能希望加速器避免將數據複製到其自己的專用存儲器中,並對公用存儲器中的實例進行操作。

我們如何告訴OpenACC不要複製數據?

回答

1

請注意,數組默認情況下是共享的。

「create」數據子句將在設備上創建數據但不執行復制。

如果要使用已在設備上創建的數據,例如通過調用cudaMalloc或acc_malloc,可以使用「deviceptr」數據子句告訴編譯器在設備代碼中使用指針的地址,而不是查看使用主機地址在當前表中設備指針。

如果要將設備變量與主變量關聯,可以使用API​​調用「acc_map_data」。

這聽起來像你有更大的內存池,然後你想重新使用。在這種情況下,您可以使用OpenACC數據子句cudaMalloc或acc_malloc創建內存池。如果使用數據子句,則調用「acc_deviceptr」來獲取設備指針地址。接下來,您可以使用「acc_map_data」將主機指針與設備指針相關聯。請注意,映射數據可以是較大設備池的子集,您可以映射到偏移量,即「devptr + offset」。請參閱:https://github.com/rmfarber/ParallelProgrammingWithOpenACC/blob/master/Chapter05/acc_map.c