2017-03-02 1 views
0

, 하나는 우리가 private 절을 OpenACC에서공유 변수와의 OpenMP에서 OpenACC

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

에 의해 루프에서 변수를 공유되지 있지만 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")에 매핑 할 수 있습니다.

"acc_map_data"사용 예 : https://github.com/rmfarber/ParallelProgrammingWithOpenACC/blob/master/Chapter05/acc_map.c