我正在编写代码来处理两个用户之间的通信,并且需要LDPC的CUDA实现来快速检查错误。我以前没有使用过CUDA,但是我在GitHub(https://github.com/robertwgh/cuLDPC)上找到了一个仓库,它可以满足我的所有需求。我的问题是我无法编译该库,可能是因为它是CUDA(v4 / v5)的旧版本。
我尝试通过将所有文件添加到项目中来使用Visual Studio进行编译,但是会出现各种错误。其中一些似乎与代码本身有关,但主要问题是nvcc出现问题,出现MSB3721错误。
回购中有一个包含makefile的拉取请求,所以我检查了一下,但这没有改变错误。
然后我尝试进入命令提示符并手动使用nvcc,但出现错误
在PATH中找不到编译器'cl.exe'
我尝试通过添加来解决此问题
C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.16.27023 \ bin \
到我的PATH变量,但出现相同的错误。重置PATH之后,我还运行了vcvars32.bat和vcvars64.bat,但这两次都没有效果。
此外,我在项目属性的链接器输入依赖项中添加了cublas.lib,cudart.lib和cusparse.lib,并在构建依赖项>构建定制菜单中检查了CUDA 10.1。
我对现在的去向不知所措,非常感谢那些对此事有更多了解的人提供的帮助。
答案 0 :(得分:1)
github repo为我构建并运行的FWIW,几乎是开箱即用的。唯一需要的一些技巧是:
cuLDPC_kernel.cu
,因为它被视为来自cuLDPC.cu
的头文件git diff
的结果)首先创建一个新的启用CUDA的Visual Studio项目:
从github存储库中拖动“ src”目录。然后将cuLDPC_kernel.cu的文件属性修改为不构建。
设置“从构建中排除” =是
构建所需的代码更改:
diff --git a/src/cuLDPC.cu b/src/cuLDPC.cu
index f217de4..3c3865c 100755
--- a/src/cuLDPC.cu
+++ b/src/cuLDPC.cu
@@ -448,17 +448,17 @@ int runTest()
#if MEASURE_CPU_TIME == 1
cudaDeviceSynchronize();
- cpu_timer.stop();
- cpu_run_time += cpu_timer.stop_get();
+ //cpu_timer.stop();^M
+ //cpu_run_time += cpu_timer.stop_get();^M
printf ("\n=================================\n\r");
printf ("GPU CUDA Demo\n");
printf ("SNR = %1.1f dB\n", snr);
printf ("# codewords = %d, # streams = %d, CW=%d, MCW=%d\r\n",total_codeword * NSTREAMS, NSTREAMS, CW, MCW);
printf("number of iterations = %1.1f \r\n", aver_iter);
- printf("CPU time: %f ms, for %d simulations.\n", cpu_run_time, MAX_SIM);
- float throughput = (float)CODEWORD_LEN * NSTREAMS * MCW * CW * MAX_SIM / cpu_run_time /1000;
- printf("Throughput = %f Mbps\r\n", (float)CODEWORD_LEN * NSTREAMS * MCW * CW * MAX_SIM / cpu_run_time /1000);
+ //printf("CPU time: %f ms, for %d simulations.\n", cpu_run_time, MAX_SIM);^M
+ //float throughput = (float)CODEWORD_LEN * NSTREAMS * MCW * CW * MAX_SIM / cpu_run_time /1000;^M
+ //printf("Throughput = %f Mbps\r\n", (float)CODEWORD_LEN * NSTREAMS * MCW * CW * MAX_SIM / cpu_run_time /1000); ^M
#endif
#if MEASURE_CUDA_TIME == 1