Visual studio Visual Studio社区2017 cl.exe
我正在Windows系统上编译一些CUDA内核。据我所知,Visual studio Visual Studio社区2017 cl.exe,visual-studio,Visual Studio,我正在Windows系统上编译一些CUDA内核。据我所知,nvcc编译器需要使用cl.exe在Windows系统上编译。实现这一点的主要方法是使用VisualStudio。因此,我已安装了。在此之后,我希望在VC目录中会有bin目录,如和等多个其他问题所示。然而,我需要深入到几个层次去寻找 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x64\
nvcc
编译器需要使用cl.exe
在Windows系统上编译。实现这一点的主要方法是使用VisualStudio。因此,我已安装了。在此之后,我希望在VC
目录中会有bin
目录,如和等多个其他问题所示。然而,我需要深入到几个层次去寻找
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x64\cl.exe
这个特殊的项目旨在制作一个可以在多个不同的Windows系统上编译和使用的程序。我是否真的需要将cl.exe
文件嵌套在一起,还是错过了某种安装步骤?我期待着一条更短的路:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\bin\
最终,我需要一种尽可能简单的方法,让用户能够让他们的环境找到cl.exe文件。通常,这涉及(在最高级别)设置环境变量 查找
VCVARSALL.BAT
——这通常处于更高的级别。如果您运行它,它会设置您的环境,这样您就可以在没有路径的情况下调用CL
此处的文档:我不确定原因,但路径似乎没有更新。
请尝试从“visual studio 2017的开发者命令提示符”运行您的命令。我在不同的上下文中遇到了此问题(Elixir/Phoenix,Rust),但根本原因是相同的:
cl.exe
在编译期间找不到
我的设置是:
- 视窗10,x64
- Visual Studio Community 2017已安装,但仅用于C#开发
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat
从此,命令cl.exe
起作用。
或者(对于开发来说更方便)启动应用程序“”或“x64本机工具命令提示符VS 2017”我有一个类似的问题,Visual Studio 2017无法找到x64配置的CL.exe或MIDL.exe。从VS命令提示符中可以找到这些文件,但从VisualStudio构建时无法找到(但它确实适用于x86) 当我打开构建输出到诊断的详细性(Tools=>Options=>Project&Solutions=>build&Run=>MSBuild Project构建输出详细性)时,我注意到在x64的“SetEnv”构建步骤中没有正确扩展路径。但无论我如何尝试重新安装VisualStudio、单个组件、sdk、运行时、注册表清理等,都没有解决问题(我几乎要重新安装Windows)
BU,然后我发现VisualStudioC++项目可能会从应用程序数据文件夹中导入“用户。道具”文件;这是项目文件中的此部分:
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
$(UserRootDir)在我的电脑上计算为C:\Users[username]\AppData\Local\Microsoft\MSBuild\v4.0,我在其中找到了Microsofr.Cpp.xxx.user.props文件。正是这些文件具有旧路径(早期安装和其他工具的遗留)
因此,我的解决方案是删除AppData文件夹中的这些道具文件。我尝试了Theo的配置Visual Studio的解决方案,但这对我不起作用。我正在Windows 10上运行Visual Studio Community 2017,CUDA Toolkit 10.0。准确地说,我进入了
C:\ProgramFiles(x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
并运行了vcvarsamd64\u x86.bat
。我的PyCUDA仍然无法编译,因为未找到cl.exe
最后,我在Visual Studio 2017上创建了一个测试CUDA项目(“文件”-->“新项目”),并在左侧选择了相应的CUDA
然后我构建了(Ctrl+Shift+B或转到“构建”-->“构建解决方案”)显示的示例(这是一个简单的向量加法,如下所示)
#包括“cuda_runtime.h”
#包括“设备启动参数.h”
#包括
cudaError\u t addWithCuda(int*c,const int*a,const int*b,unsigned int size);
__全局无效addKernel(int*c,const int*a,const int*b)
{
int i=threadIdx.x;
c[i]=a[i]+b[i];
}
int main()
{
常数int arraySize=5;
常数int a[arraySize]={1,2,3,4,5};
const int b[arraySize]={10,20,30,40,50};
int c[arraySize]={0};
//并行添加向量。
cudaError\u t cudaStatus=addWithCuda(c、a、b、arraySize);
if(cudaStatus!=cudaSuccess){
fprintf(stderr,“addWithCuda失败!”);
返回1;
}
printf({1,2,3,4,5}+{10,20,30,40,50}={%d、%d、%d、%d}\n),
c[0],c[1],c[2],c[3],c[4]);
//必须在退出之前调用cudaDeviceReset,以便进行分析和
//跟踪工具,如Nsight和visualprofiler,用于显示完整的跟踪。
cudaStatus=cudadeviceset();
if(cudaStatus!=cudaSuccess){
fprintf(stderr,“cudaDeviceReset失败!”);
返回1;
}
返回0;
}
//辅助函数,用于使用CUDA并行添加向量。
cudaError\u t addWithCuda(整数*c、常数整数*a、常数整数*b、无符号整数大小)
{
int*dev_a=0;
int*dev_b=0;
int*dev_c=0;
cudaError\u t cudaStatus;
//选择要在哪个GPU上运行,在多GPU系统上更改此选项。
cudaStatus=cudaSetDevice(0);
if(cudaStatus!=cudaSuccess){
fprintf(stderr,“cudaSetDevice失败!是否安装了支持CUDA的GPU?”);
转到错误;
}
//为三个向量分配GPU缓冲区(两个输入,一个输出)。
cudaStatus=cudamaloc((void**)和dev_c,size*sizeof(int));
if(cudaStatus!=cudaSuccess){
fprintf(stderr,“cudamaloc失败!”);
转到错误;
}
CUDA状态=
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size);
__global__ void addKernel(int *c, const int *a, const int *b)
{
int i = threadIdx.x;
c[i] = a[i] + b[i];
}
int main()
{
const int arraySize = 5;
const int a[arraySize] = { 1, 2, 3, 4, 5 };
const int b[arraySize] = { 10, 20, 30, 40, 50 };
int c[arraySize] = { 0 };
// Add vectors in parallel.
cudaError_t cudaStatus = addWithCuda(c, a, b, arraySize);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "addWithCuda failed!");
return 1;
}
printf("{1,2,3,4,5} + {10,20,30,40,50} = {%d,%d,%d,%d,%d}\n",
c[0], c[1], c[2], c[3], c[4]);
// cudaDeviceReset must be called before exiting in order for profiling and
// tracing tools such as Nsight and Visual Profiler to show complete traces.
cudaStatus = cudaDeviceReset();
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaDeviceReset failed!");
return 1;
}
return 0;
}
// Helper function for using CUDA to add vectors in parallel.
cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size)
{
int *dev_a = 0;
int *dev_b = 0;
int *dev_c = 0;
cudaError_t cudaStatus;
// Choose which GPU to run on, change this on a multi-GPU system.
cudaStatus = cudaSetDevice(0);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaSetDevice failed! Do you have a CUDA-capable GPU installed?");
goto Error;
}
// Allocate GPU buffers for three vectors (two input, one output) .
cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMalloc failed!");
goto Error;
}
cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMalloc failed!");
goto Error;
}
cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMalloc failed!");
goto Error;
}
// Copy input vectors from host memory to GPU buffers.
cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMemcpy failed!");
goto Error;
}
cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMemcpy failed!");
goto Error;
}
// Launch a kernel on the GPU with one thread for each element.
addKernel<<<1, size>>>(dev_c, dev_a, dev_b);
// Check for any errors launching the kernel
cudaStatus = cudaGetLastError();
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "addKernel launch failed: %s\n", cudaGetErrorString(cudaStatus));
goto Error;
}
// cudaDeviceSynchronize waits for the kernel to finish, and returns
// any errors encountered during the launch.
cudaStatus = cudaDeviceSynchronize();
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus);
goto Error;
}
// Copy output vector from GPU buffer to host memory.
cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMemcpy failed!");
goto Error;
}
Error:
cudaFree(dev_c);
cudaFree(dev_a);
cudaFree(dev_b);
return cudaStatus;
}