如何编译CUDA C ++项目

时间:2019-07-15 16:25:05

标签: c++ compilation cuda

我正在编写代码来处理两个用户之间的通信,并且需要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。

我对现在的去向不知所措,非常感谢那些对此事有更多了解的人提供的帮助。

1 个答案:

答案 0 :(得分:1)

github repo为我构建并运行的FWIW,几乎是开箱即用的。唯一需要的一些技巧是:

  • 请勿直接编译cuLDPC_kernel.cu,因为它被视为来自cuLDPC.cu的头文件
  • 注释掉一些损坏的计时码,这对于功能而言并不重要。我猜这些变量在错误的词汇范围内。 (以下git diff的结果)

首先创建一个新的启用CUDA的Visual Studio项目:

Create new CUDA-enabled Visual Studio Project

从github存储库中拖动“ src”目录。然后将cuLDPC_kernel.cu的文件属性修改为不构建。

Solution explorer menu

设置“从构建中排除” =是

Excluded from Build

构建所需的代码更改:

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
相关问题