2014-04-23 2 views
1

CUDA에서 병렬 프로그래밍으로 배열의 요소 (행렬)를 변경해야합니다.CUDA에서 배열의 요소를 지정하기

내 시도는 위의 방법이 작동하지 않는 다음

__global__ void CudaProcessingKernel(int *dataA) 
{ 

    int bx = blockIdx.x; 
    int tx = threadIdx.x; 
    int tid = bx * XTHREADS + tx; 

    if(tid< 16)  // matrix 4x4 
    { 

     if(tid==4) dataB[tid]=dataB[5]; 
     if(tid==5) dataB[tid]=dataB[6]; 
     if(tid==6) dataB[tid]=dataB[7]; 
     if(tid==7) dataB[tid]=dataB[4]; 
    } 

    __syncthreads(); 
}   

입니다.

내가 원하는 것은 :

input B[1][] = **EC 6E 4C 90** => output **6E 4C 90 EC** 

내 출력은 다음과 같습니다

**6E 90 4C 6E** 

B[4]B[7]가 같은 값을 가지고있다. 병렬 처리의 경우, 임시 저장 영역을 피할 수 있어야한다고 생각합니다 : int TEMP = B[4]; B[7]=TEMP.

내 잘못이 무엇입니까? 어떤 종류의 기억을 사용해야합니까?

+1

경쟁 조건이 있습니다. 원자 적 연산 사용을 고려해 보시겠습니까? – JackOLantern

답변

1

나는 원자력 작전을 사용하여 당신이 관찰하고있는 경쟁 조건을 피하기 위해 제안합니다. 원자 적 연산으로 atomicCAS을 사용할 수 있습니다. 아래의 접근 방식은 모든 그리드 크기에서 작동합니다. 다른 방법으로, 임시 배열 (게시물에서 언급했듯이)을 정의하고 원자 적 연산을 피할 수 있습니다.

다음은 CUDA 아토믹을 사용하는 코드입니다.

#include <stdio.h> 

#define N 10 

__global__ void swap_kernel(int* data) { 

    int tid = blockIdx.x*blockDim.x + threadIdx.x; 

    if (tid < N) { atomicCAS(&data[tid], data[tid], data[(tid+1) % N]); } 

} 

void main() { 

    int* h_vec = (int*) malloc(N*sizeof(int)); 
    int* d_vec; cudaMalloc((void**)&d_vec,N*sizeof(int)); 

    for (int i=0; i<N; i++) h_vec[i] = i; 

    cudaMemcpy(d_vec,h_vec,N*sizeof(int),cudaMemcpyHostToDevice); 

    swap_kernel<<<2,8>>>(d_vec); 

    cudaMemcpy(h_vec,d_vec,N*sizeof(int),cudaMemcpyDeviceToHost); 

    for (int i=0; i<N; i++) printf("%i %i\n",i,h_vec[i]); 

    getchar(); 

} 
+0

대단히 감사합니다. "atomicCAS"가 어떻게 작동하는지 이해할 수는 없지만 코드는 매우 자세합니다. 나는 질문이있다 : "atomicCAS"를 사용하고 임시 저장 장치에 값을 복사하는 사이에 무엇이 최상인가? – user3505155

+0

@ user3505155'atomicCAS'은 원자 "compare and swap"을 의미하며 부록 B.12.1.8에 설명되어 있습니다. C 프로그래밍 가이드. 귀하의 질문에 대해서는 성능 문제가 아니라 코드 일관성이라고 생각합니다. 일시적인 저장소를 사용하려고 시도하면 경쟁 조건 및 원자 적 연산이 코드를 다시 작성하지 않으려는 경우에만이를 방지 할 수있는 유일한 방법입니다. – JackOLantern

0

다른 사람이 읽는 동안 출력이 틀리도록 전역에서 데이터를 수정하고 있습니다. 너는 그런 식으로해야한다. 데이터를 읽은 것처럼 모든 스레드에 등록 된 데이터가 있으면 배열의 새 요소에 쓰게됩니다. 좋아요 :

+1

'__syncthreads'는 블록 내에서만 메모리 연산의 가시성을 보장합니다. – JackOLantern

+0

그래, 물론 – user3018144

관련 문제