2016-09-18 7 views
1

I가 큰 코드베이스의 맥락에서 오류가 발생 다음 코드를__assume는() NVCC에서 내부 오류가 발생하는 것 같다 "전화 매개 변수의 잘못된 번호가 ..."

struct Quadruple 
{ 
    double _sum; 
    double _corr; 

    // Fast multiply by -1, 0 or +1 (doesn't need extended precision operations). 
    __device__ inline Quadruple& MulSign(const int8_t sign); 
}; 

// ... 

__device__ inline Quadruple& Quadruple::MulSign(const int8_t sign) 
{ 
    __assume(-1 <= sign && sign <= 1); // enable more optimization premises 
    _sum *= sign; 
    _corr *= sign; 
    return *this; 
} 

// ... 

int8_t y = /* ... read from memory ... */; 
Quadruple a = /* ... computed here ... */; 
Quadruple b = Quadruple(a).MulSign(y); 

CUDA 8RC + MSVC++ 나는 다음과 같은 오류가 2013로 코드를 컴파일 할 때 : __assume(-1 <= sign && sign <= 1);을 주석 후

1> Compiling CUDA source file Example.gpu.cu... 
1> 
1> D:\ExDir>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin\nvcc.exe" -gencode=arch=compute_20,code=\"sm_21,compute_20\" --use-local-env --cl-version 2013 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include"  --keep-dir x64\Release -maxrregcount=0 --machine 64 --compile -cudart static  -D_DENSE_REP -DWIN32 -DWIN64 -DNDEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W4 /nologo /Ox /Zi /MD " -o x64\Release\Example.gpu.cu.obj "D:\ExDir\Example.gpu.cu" 
1>ptxas C : /Users/ExUser/AppData/Local/Temp/tmpxft_00002ffc_00000000-4_CuSvm.gpu.ptx, line 2513; error : Call has wrong number of parameters 
1> ptxas fatal : Ptx assembly aborted due to errors 
1> Example.gpu.cu 
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations\CUDA 8.0.targets(599,9): error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin\nvcc.exe" -gencode=arch=compute_20,code=\"sm_21,compute_20\" --use-local-env --cl-version 2013 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include"  --keep-dir x64\Release -maxrregcount=0 --machine 64 --compile -cudart static  -D_DENSE_REP -DWIN32 -DWIN64 -DNDEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W4 /nologo /Ox /Zi /MD " -o x64\Release\Example.gpu.cu.obj "D:\ExDir\Example.gpu.cu"" exited with code 255. 

를 코드는 확인 컴파일합니다.

NVCC의 버그입니까, 아니면 NVCC에서 지원하지 않는 MSVC++의 __assume입니까? 아니면 잘못된 것입니까? 해결 방법이 있습니까 (물론 __assume 또는 이와 동등한 것)?

답변

4

__assume()Microsoft (이후 인텔 icc) 컴파일러 내장입니다. 이것은 C++ 언어의 일부가 아니며 CUDA (또는 GCC 또는 Clang에서 지원되지 않습니다)와 관련하여 지원되지 않습니다.