2011-10-13 2 views
2

명시 적으로 매개 변수로 전달하지 않고 CPU에서 GPU로 데이터를 전달할 수 있습니까?명시 적으로 매개 변수로 전달하지 않고 CPU에서 GPU로 데이터 전달

주로 설탕에 대한 이유로 매개 변수로 전달하고 싶지 않습니다. 필자는 건네 줄 필요가있는 약 20 개의 상수 매개 변수를 가지고 있으며, 거의 동일한 매개 변수를 사용하여 두 개의 커널을 연속적으로 호출하기 때문에 또한 통과해야합니다.

나는

__constant__ int* blah; 

__global__ myKernel(...){ 
    ... i want to use blah inside ... 
} 

int main(){ 
    ... 
    cudaMalloc(...allocate blah...) 
    cudaMemcpy(copy my array from CPU to blah) 

} 
+2

대신 매개 변수를 구조체에 넣는 것이 어떻습니까? 전역 변수를 매개 변수로 사용하는 것은 피해야합니다. –

답변

3

cudaMemcpyToSymbol의 라인을 따라 뭔가 당신이 찾고있는 기능이 될 것으로 보인다 싶어요. cudaMemcpy과 비슷하게 작동하지만 2D 배열을 가로 질러 복사하는 것이 더 쉬운 것처럼 보이는 'offset'인수가 있습니다.

(나는 그것을 테스트 드릴 수 없습니다 때문에, 코드를 제공 주저 해요 -.하지만 참조 this threadthis post 참조)

+0

네, 고마워요. –

1

사용 __device__ 전역 변수를 적용 할 수 있습니다. 사용 방법과 비슷합니다. __constant__

1

몇 가지 방법을 사용할 수 있습니다. 그것은 당신이 어떻게 그 데이터를 사용할 것인지에 달려 있습니다.

  1. 당신의 패턴 액세스 일정하고 블록 내에서 스레드가 같은 위치를 읽기 읽기 요청을 방송 __constant__ 메모리를 사용합니다. 당신의 패턴 액세스가 주어진 위치의 이웃 관계가, 또는 임의 액세스 (병합하지 않음), 나는 당신이 읽기를해야하는 경우/사용 텍스처 메모리
  2. 추천 데이터를 작성하고 알 수있는 경우
  3. 배열의 크기는 커널에서 __device__ blah [크기]로 정의합니다. 예에서

: 당신은 커널에 세 개의 배열을 사용하지 않고 커널에 어떤 매개 변수를 전달할 수

__constant__ int c_blah[65536]; // constant memory 
__device__ int g_blah[1048576]; // global memory 

__global__ myKernel() { 
    // ... i want to use blah inside ... 
    int idx = threadIdx.x + blockIdx.x * blockDim.x; 
    // get data from constant memory 
    int c = c_blah[idx]; 
    // get data from global memory 
    int g = g_blah[idx]; 
    // get data from texture memory 
    int t = tex1Dfetch(ref, idx); 
    // operate 
    g_blah[idx] = c + g + t; 
} 


int main() { 
    // declare array in host 
    int c_h_blah[65536]; // and initialize it as you want 
    // copy from host to constant memory 
    cudaMemcpyToSymbol(c_blah, c_h_blah, 65536*sizeof(int), 0, cudaMemcpyHostToDevice); 
    // declare other array in host 
    int g_h_blah[1048576]; // and initialize it as you want 
    // declare one more array in host 
    int t_h_blah[1048576]; // and initialize it as you want 
    // declare a texture reference 
    texture<int, 1, cudaReadModeElementType> tref; 
    // bind the texture to the array 
    cudaBindTexture(0,tref,t_h_blah, 1048576*sizeof(int)); 
    // call your kernel 
    mykernel<<<dimGrid, dimBlock>>>(); 
    // copy result from GPU to CPU memory 
    cudaMemcpy(g_h_blah, g_blah, 1048576*sizeof(int), cudaMemcpyDeviceToHost); 
} 

. 이것은 단지 사용 예일 뿐이며 메모리 계층의 최적화 된 사용이 아닙니다. 즉,이 방법으로 상수 메모리를 사용하는 것은 좋지 않습니다.

희망 도움말.

+0

접근법 3이 작동하지 않습니다. 함수 본체 내부의'__device__' 선언은 CUDA에서는 불법입니다. – talonmies

+0

@talonmies하지만 파일의 전역 범위에서 \ __ device__을 선언 할 수 있습니까? – pQB

+1

네, 계산 1.x 타겟에서 컴파일러 경고를 생성하지만 작동합니다. – talonmies

관련 문제