3
votes
import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
import numpy
a = numpy.random.randn(4,4)
a = a.astype(numpy.float32)
a_gpu = cuda.mem_alloc(a.nbytes)
cuda.memcpy_htod(a_gpu, a)
mod = SourceModule("""
__global__ void doublify(float *a)
{
int idx = threadIdx.x + threadIdx.y*4;
a[idx] *= 2;
}
""")

I just installed CUDA 9.0 and pycuda, and I am following the tutorial to run the first cuda program. But it always turns out error:

CompileError: nvcc compilation of c:\users\rl74173\appdata\local\temp\tmp6nww2c\kernel.cu failed

I did some research and find some answers to this before. So I add this before running:

import os
os.system("vcvarsamd64.bat")

But it is still error.

I also see someone figure it out by adding line below to nvcc.profile

COMPILER-BINDIR = C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64

I installed visual studio community 2017,so in my case, I tried

COMPILER-BINDIR = C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\lib\amd64

But it doesn't help.

1
Did you ever fix this? Where is nvcc.profiles located? edit: by the way, shouldn't this have been "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\Hostx64\amd64" or more recently "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.12.25827\bin\Hostx64\x64"JHBonarius
I have tried a lot of different ways in different machines, but never succeed yet. I cannot figure out why, cuda just doesn't work with me.billinair
I've managed to get CUDA v9.1.xxx to work with Visal Studio 2017 by installing an older version (V15.4). I can create a DLL now, which I can probably source from Python. However, I would prefer using PyCuda. Still having this error though.JHBonarius
Ok, I've added a print(cmdline) in PyCuda's compiler.py. I've run the exact command in a windows cmd window (with vcvars64 run): nvcc --cubin -arch sm_50 -m64 -Ic:\programdata\anaconda3\lib\site-packages\pycuda\cuda kernel.cu... and it works! Why doesn't pycuda work then....JHBonarius
better idea: I've added print(stdout) after the call. Output: "nvcc fatal : Cannot find compiler 'cl.exe' in PATH". So it seems the call to vcvars[...].bat does not change the PATH correctly.JHBonarius

1 Answers

1
votes

OK, so I fixed it for me. The problem is that running vcvars64.bat sets the path environment in a subshell... and then closes it, so the set path disappears again.

What you want, is to change the path yourself: add the path to the cl.exe compiler file. For that, I referenced this post. In my case, I had to add this at the start to my .py file:

import os
if (os.system("cl.exe")):
    os.environ['PATH'] += ';'+r"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\bin\HostX64\x64"
if (os.system("cl.exe")):
    raise RuntimeError("cl.exe still not found, path probably incorrect")

I hope this works for you.

Edit: you need to run a MSVS version compatible with CUDA. I.e. CUDA v9.0 doesn't support MSVS2017 and CUDA v9.1 only supports version 15.4, not later versions. Try if it works by running nvcc.exe from the Native Tools Command Prompt for Visual Studio.