问题标签 [nvcc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何将英特尔 C++ 编译器与 CUDA nvcc 一起使用?
我在 Microsoft Visual Studio 2008 上使用 NVIDIA CUDA 4.1。我还安装了 Intel Parallel Studio XE 2011。
默认情况下,NVIDIA 的 C 编译器nvcc.exe
使用微软的 C 编译器cl.exe
来编译其 C 代码。
如何更改设置以便nvcc
使用 Intel's C Compiler icl.exe
。
cuda - 在 cuda 代码中循环
我运行了一些更新浮点数组的 CUDA 代码。我有一个包装函数,如如何编译 CUDA 代码然后将其链接到 C++ 项目?这个问题。
在我的 CUDA 函数中,我创建了一个像这样的 for 循环......
现在的问题是,如果 X 等于 100 的值,一切正常,但如果 X 等于 1000000,我的向量没有得到更新(几乎就像 for 循环内的代码没有被执行)
现在在包装函数内部,如果我在 for 循环中调用 CUDA 函数,它仍然可以正常工作,(但由于某种原因,比我简单地在 CPU 上执行相同的过程要慢得多)像这样......
有谁知道为什么我可以在包装函数中循环一百万次,而不是简单地调用一次 CUDA“更新”函数,然后在该函数内部启动一百万的 for 循环?
cuda - /usr/bin/ld: 找不到 -lcudart
我在尝试编译 CUDA 程序时收到以下消息:
/usr/bin/ld: 找不到 -lcudart
以前从来没有遇到过这种错误。我的 PATH 有问题吗?
这是编译命令:
gfortran -g -O2 -ffree-line-length-none -I../shared/ -o ../../bin/xspecfem3D ../../obj/spec/program_specfem3D.o ../../ obj/spec/specfem3D_par.o ../../obj/spec/PML_init.o ../../obj/spec/compute_boundary_kernel.o ../../obj/spec/compute_kernels.o ../. ./obj/spec/compute_forces_acoustic.o ../../obj/spec/compute_forces_acoustic_pot.o ../../obj/spec/compute_forces_acoustic_PML.o ../../obj/spec/compute_forces_elastic.o .. /../obj/spec/compute_forces_elastic_Dev.o ../../obj/spec/compute_forces_elastic_noDev.o ../../obj/spec/compute_forces_elastic_Dev_openmp.o ../../obj/spec/compute_add_sources_acoustic.o ../../obj/spec/compute_add_sources_elastic.o ../../obj/spec/compute_coupling_acoustic_el.o ../../obj/spec/compute_coupling_elastic_ac.o ../../obj/spec/compute_stacey_acoustic .o ../../obj/spec/compute_stacey_elastic.o ../../obj/spec/compute_gradient.o ../../obj/spec/compute_interpolated_dva.o ../../obj/spec/initialize_simulation.o ../../obj/spec/read_mesh_databases.o ../ ../obj/spec/setup_GLL_points.o ../../obj/spec/write_movie_output.o ../../obj/spec/create_color_image.o ../../obj/spec/write_seismograms.o . ./../obj/spec/write_output_ASCII.o ../../obj/spec/detect_mesh_surfaces.o ../../obj/spec/setup_movie_meshes.o ../../obj/spec/read_topography_bathymetry。 o ../../obj/spec/setup_sources_receivers.o ../../obj/spec/prepare_timerun.o ../../obj/spec/iterate_time.o ../../obj/spec/ finalize_simulation.o ../../obj/spec/save_adjoint_kernels.o ../../obj/spec/specfem3D.o ../../obj/spec/assemble_MPI_vector.o ../../obj/规格/make_gravity.o ../../obj/spec/noise_tomography.o ../../lib/libspecfem.a ../../obj/spec/check_fields_cuda.cuda.o ../../obj/spec/compute_add_sources_acoustic_cuda.cuda.o ../../obj/spec/compute_add_sources_elastic_cuda.cuda.o ../../obj/spec/compute_coupling_cuda.cuda.o ../../obj/spec/ compute_forces_acoustic_cuda.cuda.o ../../obj/spec/compute_forces_elastic_cuda.cuda.o ../../obj/spec/compute_kernels_cuda.cuda.o ../../obj/spec/compute_stacey_acoustic_cuda.cuda.o ../../obj/spec/compute_stacey_elastic_cuda.cuda.o ../../obj/spec/it_update_displacement_cuda.cuda.o ../../obj/spec/noise_tomography_cuda.cuda.o ../.. /obj/spec/prepare_mesh_constants_cuda.cuda.o ../../obj/spec/transfer_fields_cuda.cuda.o ../../obj/spec/write_seismograms_cuda.cuda.o ../../obj/spec/ save_and_compare_cpu_vs_gpu.cudacc.o ../../obj/spec/serial.o -lcuda -lcudart -lcublaso ../../obj/spec/compute_coupling_cuda.cuda.o ../../obj/spec/compute_forces_acoustic_cuda.cuda.o ../../obj/spec/compute_forces_elastic_cuda.cuda.o ../. ./obj/spec/compute_kernels_cuda.cuda.o ../../obj/spec/compute_stacey_acoustic_cuda.cuda.o ../../obj/spec/compute_stacey_elastic_cuda.cuda.o ../../obj/spec /it_update_displacement_cuda.cuda.o ../../obj/spec/noise_tomography_cuda.cuda.o ../../obj/spec/prepare_mesh_constants_cuda.cuda.o ../../obj/spec/transfer_fields_cuda.cuda。 o ../../obj/spec/write_seismograms_cuda.cuda.o ../../obj/spec/save_and_compare_cpu_vs_gpu.cudacc.o ../../obj/spec/serial.o -lcuda -lcudart -lcublaso ../../obj/spec/compute_coupling_cuda.cuda.o ../../obj/spec/compute_forces_acoustic_cuda.cuda.o ../../obj/spec/compute_forces_elastic_cuda.cuda.o ../. ./obj/spec/compute_kernels_cuda.cuda.o ../../obj/spec/compute_stacey_acoustic_cuda.cuda.o ../../obj/spec/compute_stacey_elastic_cuda.cuda.o ../../obj/spec /it_update_displacement_cuda.cuda.o ../../obj/spec/noise_tomography_cuda.cuda.o ../../obj/spec/prepare_mesh_constants_cuda.cuda.o ../../obj/spec/transfer_fields_cuda.cuda。 o ../../obj/spec/write_seismograms_cuda.cuda.o ../../obj/spec/save_and_compare_cpu_vs_gpu.cudacc.o ../../obj/spec/serial.o -lcuda -lcudart -lcublas/obj/spec/compute_stacey_acoustic_cuda.cuda.o ../../obj/spec/compute_stacey_elastic_cuda.cuda.o ../../obj/spec/it_update_displacement_cuda.cuda.o ../../obj/spec/ noise_tomography_cuda.cuda.o ../../obj/spec/prepare_mesh_constants_cuda.cuda.o ../../obj/spec/transfer_fields_cuda.cuda.o ../../obj/spec/write_seismograms_cuda.cuda.o ../../obj/spec/save_and_compare_cpu_vs_gpu.cudacc.o ../../obj/spec/serial.o -lcuda -lcudart -lcublas/obj/spec/compute_stacey_acoustic_cuda.cuda.o ../../obj/spec/compute_stacey_elastic_cuda.cuda.o ../../obj/spec/it_update_displacement_cuda.cuda.o ../../obj/spec/ noise_tomography_cuda.cuda.o ../../obj/spec/prepare_mesh_constants_cuda.cuda.o ../../obj/spec/transfer_fields_cuda.cuda.o ../../obj/spec/write_seismograms_cuda.cuda.o ../../obj/spec/save_and_compare_cpu_vs_gpu.cudacc.o ../../obj/spec/serial.o -lcuda -lcudart -lcublaso -lcuda -lcudart -lcublaso -lcuda -lcudart -lcublas
/usr/bin/ld: 找不到 -lcudart
collect2: ld 返回 1 个退出状态
编辑:
我已将链接命令更改为
gfortran -g -O2 -ffree-line-length-none -I../shared/ -L$CUDA_HOME/lib [其余如下]
我所有的 PATH 似乎都没问题,但我仍然遇到同样的错误。
编辑2:
错误是我试图编译的代码是 64 位的,所以我需要为路径提供一组不同的 .so's ,它们位于
/usr/local/cuda/lib64
现在编译运行良好,没有任何问题。
c++ - Cuda (NVCC) 编译器的_ITERATOR_DEBUG_LEVEL?
有谁知道 NVCC 设置的 _ITERATOR_DEBUG_LEVEL 是什么?
我在 VS2010 的 Cmake 项目中工作,尝试链接项目时出现链接错误:
我可以将 c++ 文件的 _ITERATOR_DEBUG_LEVEL 设置为 0,但是它不再与其他一些库链接。所以我需要一种方法来使 nvcc 编译为 2 级。
在发布模式下使用所有内容都有效,因此级别似乎设置正确。用于编译的命令行如下所示:
cuda - CUDA 的 nvcc 不能正确编译三元运算符/条件简写?
编辑
这是您编译的一个小程序,您可以自己查看这些错误......
运行时MyKernel2
,将正确的输出写入数组:
MyKernel1
运行时,使用相同的基于三元的 idx 分配,所有结果都为零:
当PrintMethod1
(使用三元边界)运行时,它会出现段错误,基本上陷入无限循环。注意,这是在主机端!!
运行时PrintMethod2
,输出打印正常如上所示。
这是我的编译命令:
关于我唯一的线索是它抱怨两个内核都有一个不正确的参数,尽管它看起来是正确的并且得到了正确的结果MyKernel2
。
我认为上面的例子几乎是评论者可以根据下面的描述自己尝试的,但它可以节省你编写代码的时间和精力!
让我知道是否还有其他可以发布的内容,以帮助解决这个问题。
原始问题
大多数 C 编译器,由 lang. 标准支持三元运算符。
例如
然而,令人惊讶的是nvcc
,当它们在内核中使用时,CUDA 似乎剥离了一些三元运算符并用零替换它们......
我通过申请cuPrintf
检查有问题的代码块发现了这一点。例如,假设我有两个内核为它们的输出共享一个全局数组。第一个内核处理第一块元素。第二个内核获得一个偏移量,以指示在数组中跳转多远,以免覆盖第一个内核的元素。偶数和奇数的偏移量不同。
所以我可以写:
但是编写近乎等效的速记语法会更加紧凑和可读(在我看来)。
后一个代码虽然总是会产生一个零,因为 CUDA 的编译器会剪掉速记条件。
我意识到此功能代码被滥用并导致线程分歧,但在简单的情况下,如果编译器正确处理它,它似乎与标准条件没有任何不同。
这是编译器中的错误还是故意不支持?
有谁知道这个功能是否会出现在 CUDA 中?
我很惊讶地发现这是我寻址失败和段错误的根源......
编辑
这是一个标准的 C 功能,我误读并错误地说它是非标准的。
编辑 2
我曾为编译器说“窒息而死”。“死”绝对是不恰当的术语。相反,nvcc
完成了编译,但显然已经剥离了基于三元运算符的赋值并将其替换为零。后来这会回来并咬我,因为没有将内容写入正确的位置,而这些位置又被用作双索引方案中的索引。这些索引是在 CPU 端的总结期间使用的,因此段错误发生在 CPU 端,但由编译器截图驱动。
我正在使用编译器 v4.1 并已-O2
打开。看来优化器可能正在优化三元运算中使用的变量,这可能是此错误的根源。
容易出错的三元运算与我上面给出的示例几乎相同,但涉及到大量的加法运算。
我计划遵循以下评论者的建议并向 NVIDIA 提交错误报告,但我将这篇文章作为对其他人的警告。
编辑 3
这里有一个稍微净化过的完整声明,它总是产生零:
gcc - 使用 nvcc 时 fopen 无法打开可写文件
编辑:我认为问题是由于 nvcc 调用 C++ 编译器而不是 C 编译器,因为当我不将 malloc(3) 调用转换为 char* 时收到错误。我通过以下方式得出这个断言:从 void* 到 char** 的无效转换
编辑编辑:如果我使用 fileO = fopen(version, "w"); 效果很好 绕过 strcpy 和 strcat 调用。(哈哈,我说的是猫叫声……)
所以我有一个 CUDA 程序,我从同一程序的顺序版本(非 CUDA)中收集了一些文件 I/O。完全相同的代码适用于常规 gcc 编译,但不适用于 nvcc。我知道 nvcc 将 C/C++ 分流到本机 C++ 编译器,但由于某种原因,它只是没有打开可写文件。我已经打开和关闭了另一个文件流,用于在上面的代码中读取数据,但我在我的顺序版本中这样做,它在那里工作正常。
以下是相关代码:
我每次都收到“写入文件创建失败”。
有任何想法吗?
cuda - CUDA 带宽测试.cu
我想在 CUDA SDK 中编译和运行 bandwidthTest.cu。编译时遇到以下两个错误:
我怎么解决这个问题?
cuda - 在 CUDA SDK 中的 bandwidthTest.cu 中检测到堆栈粉碎
我想在 CUDA SDK 中运行 bandwidthTest。它因堆栈粉碎检测到的错误而终止。我怎么解决这个问题?????我使用 make 命令运行该程序并制作文件。我无法更改代码中的任何内容。
cuda - deviceQuery 程序 - 多处理器数 = 0
我已经在 CUDA SDK 中执行了 deviceQuery 程序。文件中多处理器和内核的数量为 0,我确定这不是真的。可能是什么原因?
cuda - nvcc --ptxas-options=-v(寄存器和内存使用)错误
我想用 nvcc 的 --ptxas-options=-v 标志编译我的 cuda 程序,以实现寄存器和内存使用,以便在 CUDA GPU 占用计算器中使用它们。
错误:标识符“atomicAdd”未定义
我在内核中使用了 atomicAdd。我怎么解决这个问题?