我已经安装了Windows SDK 7.1平台工具,并且打开了一个名为Microsoft Windows 7 x64 Debug Build Environment
的terminal。 现在我想使用cl.exe
命令编译一个C++
应用程序(名为main.cpp
)。 编译命令是:
cl main.cpp
然后,它输出main.obj
和main.exe
文件。 但是当我试图运行main.exe
,在begin computing dist
和在end computing dist.
之前崩溃了end computing dist.
我想我应该把应用程序编译成x64
程序。 请问有人可以提供意见吗?
main.cpp
如下:
#include <cstdio> #include <cstdlib> #ifdef _MSC_VER typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #include <intrin.h> #include <windows.h> #else #include <stdint.h> #include <sys/time.h> #include <unistd.h> #endif int main(int argc, char **argv) { int nTrn = 10; int nTst = 10; int nDim = 1; // 64 bit printf("allocate memory for feats.\n"); uint64_t *trn_feat = new uint64_t[nTrn]; // nTrn x nDim uint64_t *tst_feat = new uint64_t[nTst]; // nTst x nDim printf("initialize the feats.\n"); for(int i=0; i<nTrn; i++) trn_feat[i] = (((uint64_t) rand() << 0) & 0x000000000000FFFFull) | (((uint64_t) rand() << 16) & 0x00000000FFFF0000ull) | (((uint64_t) rand() << 32) & 0x0000FFFF00000000ull) | (((uint64_t) rand() << 48) & 0xFFFF000000000000ull); for(int i=0; i<nTst; i++) tst_feat[i] = (((uint64_t) rand() << 0) & 0x000000000000FFFFull) | (((uint64_t) rand() << 16) & 0x00000000FFFF0000ull) | (((uint64_t) rand() << 32) & 0x0000FFFF00000000ull) | (((uint64_t) rand() << 48) & 0xFFFF000000000000ull); printf("allocate memory for dist matrix.\n"); uint64_t *dist = new uint64_t[nTrn*nTst]; #ifdef _MSC_VER LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds; LARGE_INTEGER Frequency; QueryPerformanceFrequency(&Frequency); QueryPerformanceCounter(&StartingTime); #else struct timeval start, end; long seconds, useconds; double mtime; gettimeofday(&start, NULL); #endif printf("begin computing dist.\n"); for(int iter=0; iter<100; iter++) { for(int i=0; i<nTrn; i++) { for(int j=0; j<nTst; j++) { uint64_t n = (trn_feat[i] ^ tst_feat[j]); #ifdef _MSC_VER dist[i*nTst + j] = __popcnt64(n); #else dist[i*nTst + j] = __builtin_popcountll(n); #endif } } } printf("end computing dist.\n"); #ifdef _MSC_VER QueryPerformanceCounter(&EndingTime); ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart; ElapsedMicroseconds.QuadPart *= 1000000; ElapsedMicroseconds.QuadPart /= Frequency.QuadPart; double mtime = (double)ElapsedMicroseconds.QuadPart; printf("Average time: %.6f nanoseconds\n", (1e6*mtime)/100/(nTrn*nTst)); #else gettimeofday(&end, NULL); seconds = end.tv_sec - start.tv_sec; useconds = end.tv_usec - start.tv_usec; mtime = ((seconds) * 1000 + useconds/1000.0) + 0.5; printf("Total elapsed time: %.6f milliseconds\n", mtime); printf("Average time: %.6f nanoseconds\n", (1e6*mtime)/1000/(nTrn*nTst)); #endif delete[] trn_feat; delete[] tst_feat; delete[] dist; }
以下是可能的答案:
Visual Studio Community 2015
Visual Studio Group
打开Visual Studio x64 terminal
cl.exe main.cpp /link /machine:x64
然后一个main.exe
输出。
要运行main.exe
,有两个必要的条件:
__popcnt64
指令集。 要检查机器是否支持它,请参阅__cpuid 。