MS VS2005에서 CUDA SDK 3.1을 GPU GTX465 1GB와 함께 사용하고 있습니다. 나는 그런 커널 기능이 있습니다CUDA의 시간 초과?/fermi/gtx465
__global__ void CRT_GPU_2(float *A, float *X, float *Y, float *Z, float *pIntensity, float *firstTime, float *pointsNumber)
{
int holo_x = blockIdx.x*20 + threadIdx.x;
int holo_y = blockIdx.y*20 + threadIdx.y;
float k=2.0f*3.14f/0.000000054f;
if (firstTime[0]==1.0f)
{
pIntensity[holo_x+holo_y*MAX_FINAL_X]=0.0f;
}
for (int i=0; i<pointsNumber[0]; i++)
{
pIntensity[holo_x+holo_y*MAX_FINAL_X]=pIntensity[holo_x+holo_y*MAX_FINAL_X]+A[i]*cosf(k*sqrtf(pow(holo_x-X[i],2.0f)+pow(holo_y-Y[i],2.0f)+pow(Z[i],2.0f)));
}
__syncthreads();
}
을이 커널 함수를 호출 기능입니다 :
extern "C" void go2(float *pDATA, float *X, float *Y, float *Z, float *pIntensity, float *firstTime, float *pointsNumber)
{
dim3 blockGridRows(MAX_FINAL_X/20,MAX_FINAL_Y/20);
dim3 threadBlockRows(20, 20);
CRT_GPU_2<<<blockGridRows, threadBlockRows>>>(pDATA, X, Y, Z, pIntensity,firstTime, pointsNumber);
CUT_CHECK_ERROR("multiplyNumbersGPU() execution failed\n");
CUDA_SAFE_CALL(cudaThreadSynchronize());
}
내가이 함수에 루프의 모든 paramteres을로드하고 (예 : 각 매개 변수에 대한 4096 개 요소 하나의 루프 반복). 전체적으로 모든 루프 반복 후에 각 매개 변수에 대해 32768 개 요소에 대해이 커널을 만들고 싶습니다.
MAX_FINAL_X 1920과 MAX_FINAL_Y은 1080 내가 alghoritm 첫 번째 반복을 시작하고
이 매우 빠르게 이동하고 하나 또는 두 개의 반복 후 더 내가 CUDA 시간 제한 오류에 대한 정보를 얻을 수있다. GPU gtx260에이 alghoritm을 사용했는데 기억하는 한 더 잘하고있었습니다 ...
이 알고리즘의 새로운 Fermi 아치에 따르면 어쩌면 제가 실수를하고 있습니까?
나는 또한 당신의 단서가 거의 2 시간이 alghoritm 속도를, pointNumber [0] 값에 실수를했다 gpu (gtx260 896MB ~ gtx465 1GB)의 변경으로 인해 메모리 관리에서 실수가 발생할 수 있습니다. gtx260에서 나는 500 * 500 * 500의 플로트 배열 (이것은 LUT 배열의 종류입니다)을 float에 할당 할 수 있었고 gtx에서 60 * 60 * 60 float 배열을 할당 할 때 "unspecified launch error"오류가 발생합니다. 호스트에서 장치 메모리로 데이터를 복사하십시오 (이 memcopy는 해당 LUT 배열과 연결되어 있지 않습니다) ...? – Tome
코드 없이는 말하기가 매우 어렵습니다 ... memcpy 중에 새로운 오류를 보았습니다. 이 오류는 호스트 프로그램의 "Segmentation fault"와 동일하며 커널에서 발생합니다. 'CUT_CHECK_ERROR'는 이전의 커널 시작으로 인해 발생할 수있는 오류 메시지를 읽습니다 ('cudaThreadSynchronize'를 사용하지 않으면). cudaMemcpy''의 매개 변수를 확인 - : 1. 커널 출시 2. 모든 cudaMemcpy * 비동기 3. 방어 적이기 장치 <-> 장치 4. 메모리 초기화 조언 : operatioins 비동기 단지 4 종류가 있습니다. 올바른 순서와 올바른 메모리 할당 (아마도 'cudaMalloc'을 잊어 버린 것입니까?) - emu 모드를 사용하여 dbg를 만듭니다. – KoppeKTop
그리고 1 더 추측. 커널에 경계 체크를 추가합니까? 사실, 2 회 - 제한이 아님) A, X, Y 및 Z +를 저장하기 위해 __constant__ 메모리를 사용할 경우 어쩌면 다음으로 이동하십시오. (예 : holo_x + holo_y * MAX_FINAL_X> = MAX_FINAL_X * MAX_FINAL_Y) 빠른 수학 (신중하게)을 좀 더 빨리 할 수 있습니다. – KoppeKTop