0
상수 메모리와 관련된 많은 SO 질문을 읽었으므로 왜 프로그램이 작동하지 않는지 아직 이해할 수 없습니다.CUDA 상수 메모리 값이 잘못되었습니다.
Common.cuh
__constant__ int numElements;
__global__
void kernelFunction();
Common.cu
#include "Common.cuh"
#include <stdio.h>
__global__
kernelFunction()
{
printf("NumElements = %d", numElements);
}
Test.cu
#include "Common.cuh"
int main()
{
int N = 100;
cudaMemcpyToSymbol(numElements,&N,sizeof(int));
kernelFunction<<<1,1>>>();
cudaDeviceSynchronize();
return 0;
}
I을 다음과 같이 전체적으로 본다 t는 오류없이 컴파일하지만 numElements
값을 인쇄 할 때 나는 임의의 값을 얻는다. 누군가가 이것을 이해할 수있는 올바른 방향으로 나를 가리킬 수 있습니까?
이 잘 작동합니다. 그러나 ** Test.cu **에서 상수 변수를 사용하려면'nvlin 오류가 발생합니다 : numElements' 다중 정의 – BRabbit27
아마도 당신은 대답을 읽고 코드를 자세히 읽어야합니다. test.cu *는 상수 변수에 쓰는 것과 동일한 상수 변수를 사용하고, 상수 변수에 쓰는 것은'kernelFunction'을 호출합니다. 다중 정의 오류는'numElements'가 한 곳에서만 정의 될 수 있기 때문에 발생합니다. 다른 곳에서는 'extern'으로 참조해야합니다. 답변을 다시 읽으십시오. –
내 대답은 * more *가 컴파일 명령보다 코드와 다릅니다. 또한 헤더 파일의'numElements' * out * 정의를 소스 파일 중 하나 ('common.cu')로 옮겼습니다. 내 헤더 파일 ('common.cuh')에서는'extern'에 의해 numElements 만 참조하고, 그 헤더 파일이'common.cu '이외의 파일에 포함되어 있다면 * only *를 참조합니다. 따라서 명령 차이 만 컴파일하는 것이 아니라 내 대답과 코드 사이에 코드가 변경되었습니다. –