2017-11-22 11 views
0

도와주세요. 1) gpu에 할당 된 배열을 이동하려면 memcpy를 사용해야합니다. std :: memcpy는 "acc 루틴이 없다"(컴파일러 출력) 때문에 사용할 수 없습니다. 내 코드는openacc의 장치 배열에 memcpy 사용

const int GL=100000; 
Particle particles[GL]; 
int cp01[2][GL]; 
#pragma acc declare create(particles,cp01) 
... 

입니다. 나는 cudaMemcpy를 openacc와 함께 사용할 수 있다고 읽었습니다. function_device() (not able to fill the array allocated on the gpu)에서 난 CUDA를 사용하기위한 헤더

#include <cuda_runtime.h> 

를 사용하여 호스트

#pragma acc data copy(cp) 
{ 
    cudaMemcpy(&particles[cp01[0][0]],&particles[cp01[1][0]],cp*sizeof(Particle),cudaMemcpyDeviceToDevice); 
} 

에서 부른다.

cmake ../src -DCMAKE_CXX_COMPILER=pgc++ -DCMAKE_CXX_FLAGS="-acc -Minfo=all -Mcuda=llvm" 

프로그램을 컴파일하지만 작동하지 않습니다. 콘솔 행에 출력되지 않고 중단됩니다. 장치에 할당 된 배열을 이동하는 방법 (cudaMemcpy 또는 다른 방법으로)? CUDA를 사용하기에 충분합니까? 프로젝트를 올바르게 빌드합니까 (-Mcuda = llvm이 필요합니까?)? 2) 내가 또 다른 질문이 있습니다 : 하나는

#pragma acc parallel loop 
for(int i=0; i<N; ++i) 
{...} 

변수 N

는 호스트에 할당해야하거나 GPU에서도있을 수 있습니다 쓴다면?

답변

0

"cudaMemcpy"는 장치 포인터를 전달할 호스트 측 호출이므로 "host_data"지시문을 사용하는 것이 좋습니다. 호스트 값을 사용하기 때문에 "cp"를 복사 할 필요가 없습니다. 또한 "cp01"의 호스트 값이 최신인지 확인하십시오.

#pragma acc host_data use_device(particles) 
    { 
    cudaMemcpy(&particles[cp01[0][0]],&particles[cp01[1] [0]],cp*sizeof(Particle),cudaMemcpyDeviceToDevice); 
    } 
: 다음과 같은

뭔가