每当我绘制一个使用cuFFT程序获得的值并将结果与Matlab进行比较时,我都会得到相同形状的图形,并且最大值和最小值都在相同的点上。但是,cuFFT产生的值比Matlab产生的值大得多。Matlab代码是
fs = 1000; % sample freq
D = [0:1:4]'; % pulse delay times
t = 0 : 1/fs : 4000/fs; % signal evaluation time
w = 0.5; % width of each pulse
yp = pulstran(t,D,'rectpuls',w);
filt = conj(fliplr(yp));
xx = fft(yp,1024).*fft(filt,1024);
xx = (abs(ifft(xx)));
Run Code Online (Sandbox Code Playgroud)
输入相同的CUDA代码如下:
cufftExecC2C(plan, (cufftComplex *)d_signal, (cufftComplex *)d_signal, CUFFT_FORWARD);
cufftExecC2C(plan, (cufftComplex *)d_filter_signal, (cufftComplex *)d_filter_signal, CUFFT_FORWARD);
ComplexPointwiseMul<<<blocksPerGrid, threadsPerBlock>>>(d_signal, d_filter_signal, NX);
cufftExecC2C(plan, (cufftComplex *)d_signal, (cufftComplex *)d_signal, CUFFT_INVERSE);
Run Code Online (Sandbox Code Playgroud)
cuFFT还执行1024批处理大小为的点FFT 2。
使用的比例因子时NX=1024,值不正确。请告诉该怎么办。
好吧,我的问题可能是一般性的,因为我现在没有具体的问题。
然而,根据我过去的经验,我从未见过CUDA的只读数据缓存优于其他类型的内存访问,例如全局内存或常量内存,在最好的情况下,只读数据缓存将与直接非合并全局一样快内存访问,这让我觉得我可能做错了什么。
所以我的问题是在什么情况下只读数据缓存会比其他类型的内存访问更快?
我试图找出GPU张量操作实际上是否比CPU更快.所以,我在下面编写了这个特殊的代码来连续实现CPU张量和GPU cuda张量的简单2D添加,以查看速度差异:
import torch
import time
###CPU
start_time = time.time()
a = torch.ones(4,4)
for _ in range(1000000):
a += a
elapsed_time = time.time() - start_time
print('CPU time = ',elapsed_time)
###GPU
start_time = time.time()
b = torch.ones(4,4).cuda()
for _ in range(1000000):
b += b
elapsed_time = time.time() - start_time
print('GPU time = ',elapsed_time)
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,CPU时间为0.93秒,GPU时间高达63秒.我是否正确地进行了cuda张量操作,或者cuda张量的概念是否仅在非常复杂的操作中更快地运行,如在神经网络中?
注意:我的GPU是NVIDIA 940MX,torch.cuda.is_available()调用返回True.
我正在尝试编译一个使用cusparse库的cuda程序.我收到链接错误:
kernel.cu.obj : error LNK2019: unresolved external symbol _cusparseSetMatIndexBase@8 referenced in function _main
Run Code Online (Sandbox Code Playgroud)
和cusparse库有很多相同的错误.我已经包含了"cusparse_v2.h".如何在编辑期间链接visual studio 2010中的cusparse库?
我想测试cudaMalloc和cudaFree是否是同步调用,所以我对CUDA SDK中的"simpleMultiGPU.cu"示例代码进行了一些修改.以下是我更改的部分(添加的行不缩进):
float *dd[GPU_N];;
for (i = 0; i < GPU_N; i++){cudaSetDevice(i); cudaMalloc((void**)&dd[i], sizeof(float));}
//Start timing and compute on GPU(s)
printf("Computing with %d GPUs...\n", GPU_N);
StartTimer();
//Copy data to GPU, launch the kernel and copy data back. All asynchronously
for (i = 0; i < GPU_N; i++)
{
//Set device
checkCudaErrors(cudaSetDevice(i));
//Copy input data from CPU
checkCudaErrors(cudaMemcpyAsync(plan[i].d_Data, plan[i].h_Data, plan[i].dataN * sizeof(float), cudaMemcpyHostToDevice, plan[i].stream));
//Perform GPU computations
reduceKernel<<<BLOCK_N, THREAD_N, 0, plan[i].stream>>>(plan[i].d_Sum, plan[i].d_Data, plan[i].dataN);
getLastCudaError("reduceKernel() execution failed.\n");
//Read back GPU results
checkCudaErrors(cudaMemcpyAsync(plan[i].h_Sum_from_device, …Run Code Online (Sandbox Code Playgroud) 我正在使用配备 Intel Corporation HD Graphics 520 的笔记本电脑。有谁知道如何为深度学习设置它,特别是 Pytorch?我已经看到如果你有 Nvidia 显卡我可以安装 cuda 但是当你有英特尔 GPU 时该怎么办?
我正在学习cuda,到目前为止,我已经了解到cuda具有cudaMalloc()为全局对象分配内存的功能.但是现在在一些矩阵乘法代码中,我已经看到它们正在使用另一个函数cudaMemcpy(),该函数将一个对象从主机复制到另一个设备或者反过来.但我不明白为什么需要它?由于cudaMalloc()是分配全局内存,所有设备内核都应该有权访问它,不应该吗?
我的误会在哪里?
我正在尝试使用cuSOLVER库实现Cholesky分解。我是一名初学者CUDA程序员,并且我一直指定块大小和网格大小,但是我无法找出程序员如何使用cuSOLVER函数显式设置它。
这是文档:http : //docs.nvidia.com/cuda/cusolver/index.html#introduction
QR分解是使用cuSOLVER库实现的(请参见此处的示例:http ://docs.nvidia.com/cuda/cusolver/index.html#ormqr-example1 ),即使在此处也未设置上述两个参数。
总结一下,我有以下问题
我试图从主机ubuntu机器上运行远程Ubuntu机器上的CUDA粒子样本.我遵循了这个教程:http: //devblogs.nvidia.com/parallelforall/remote-application-development-nvidia-nsight-eclipse-edition/它在我的主机上运行,但不在我的远程机器上运行.
我在Nsight中得到以下输出:
CUDA Particles Simulation Starting...
grid: 64 x 64 x 64 = 262144 cells
particles: 16384
No protocol specified
freeglut (/users/path/particles/Debug/particles): failed to open display ':0'
logout
Run Code Online (Sandbox Code Playgroud)
如果我从终端运行程序,我得到:
CUDA Particles Simulation Starting...
grid: 64 x 64 x 64 = 262144 cells
particles: 16384
CUDA error at ../src/particleSystem_cuda.cu:85 code=79(cudaErrorInvalidGraphicsContext) "cudaGraphicsGLRegisterBuffer(cuda_vbo_resource, vbo, cudaGraphicsMapFlagsNone)"
Run Code Online (Sandbox Code Playgroud)
是否可以在我的主机上显示粒子模拟,而计算是在远程系统上进行的?
它是通过X11Forwarding实现的,还是完全不同的错误?
我正在将一些代码从一台电脑上的 VS2017 移动到另一台装有 VS2019 的电脑。一切都很好,除了我不能使用 std::filesystem 。在我以前的代码中,我使用 C++14 并拥有 std::experimental::filesystem。在新代码中,我想迁移到 C++17,因此我更改为 std::filesystem (如下面的代码所示)。奇怪的是,智能感知(不确定它是正确的名称)没有显示错误。当我输入 std::f 时它甚至会显示文件系统...
但代码不会构建并给出错误“命名空间“std”没有成员“文件系统””。
我将C++语言标准更改为c++latest,VS2019版本是Community 16.6.5。
#include <string>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
std::string path = "C:\\";
for (const auto& entry : fs::directory_iterator(path))
std::cout << entry.path() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我最初的问题的最后一行可能不够清楚:我已经将“C++ 语言标准”更改为 C++17 或 C++latest。
感谢@drescherjm,我们发现这是一个 Cuda 问题。Cuda 专家有什么想法吗?