我正在尝试使用 FFT 与使用加窗方法比较互相关。
我的 Matlab 代码是:
isize = 20;
n = 7;
for i = 1:n %%7x7 xcorr
for j = 1:n
xcout(i,j) = sum(sum(ffcorr1 .* ref(i:i+isize-1,j:j+isize-1))); %%ref is 676 element array and ffcorr1 is a 400 element array
end
end
Run Code Online (Sandbox Code Playgroud)
类似的CUDA内核:
__global__ void xc_corr(double* in_im, double* ref_im, int pix3, int isize, int n, double* out1, double* temp1, double* sum_temp1)
{
int p = blockIdx.x * blockDim.x + threadIdx.x;
int q = 0;
int i = 0;
int j = …Run Code Online (Sandbox Code Playgroud) 这是我的代码
__device__ void calculateDT(float *devD, int *devImg, int cntVoxelLi, int *neighVoxels)
{
float minV = devD[cntVoxelLi];
int cv = devImg[cntVoxelLi];
float v = 0,cuVal = 0;
int c1=0,d1=0,r1=0;
GetInd2Sub(cntVoxelLi, r1,c1,d1);
for(int ind=0;ind<9;ind++)
{
v = pow(float(cv - devImg[neighVoxels[ind]]),2);
cuVal = devD[neighVoxels[ind]] + (1-exp(-v/100));
minV = min(minV, cuVal);
}
devD[cntVoxelLi] = minV;
}
Run Code Online (Sandbox Code Playgroud)
当我运行整个程序时,大约需要 15 秒。但是当我删除
exp(-v/100)
Run Code Online (Sandbox Code Playgroud)
只需7秒。似乎是这个exp操作需要很多时间。我也尝试使用 expf 函数。如何提高性能?
我在一台拥有四个内核的cpu的机器上运行cuda程序,如何更改cuda c程序以使用所有四个内核和所有可用的gpu?
我的意思是我的程序在gpus计算之前也在主机端执行操作'...
谢谢!
我想计算Cuda中整个图像的平均值.为了测试2D数组的减少效果,我在下面编写了这个内核.最终输出o应该是所有图像值的总和.输入g是2D阵列,每个像素的值为1.但是这个程序的结果是总和为0.对我来说有点奇怪.
我在本教程中模仿1D阵列的减少http://developer.download.nvidia.com/compute/cuda/1.1-Beta/x86_website/projects/reduction/doc/reduction.pdf我写这个2D表格.我是Cuda的新手.欢迎提出有关潜在错误和改进的建议!
只需添加一条评论.我知道计算一维数组的平均值是有意义的.但我想利用更多并测试更复杂的还原行为.这可能不对.但只是一个考验.希望任何人都能给我更多关于减少常见做法的建议.
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
cudaEvent_t start, stop;
float elapsedTime;
__global__ void
reduce(float *g, float *o, const int dimx, const int dimy)
{
extern __shared__ float sdata[];
unsigned int tid_x = threadIdx.x;
unsigned int tid_y = threadIdx.y;
unsigned int i = blockDim.x * blockIdx.x + threadIdx.x;
unsigned int j = blockDim.y * blockIdx.y + threadIdx.y;
if (i >= dimx || j >= dimy)
return;
sdata[tid_x*blockDim.y + tid_y] = g[i*dimy + j];
__syncthreads(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试在随附的代码中启动内核。我收到消息“内核启动失败:参数无效”。
// System includes
#include <stdio.h>
#include <assert.h>
// CUDA runtime
#include <cuda_runtime.h>
// Helper functions and utilities to work with CUDA
#include <helper_functions.h>
// This will output the proper CUDA error strings in the event that a CUDA host call returns an error
#define checkCudaErrors(err) __checkCudaErrors (err, __FILE__, __LINE__)
inline void __checkCudaErrors(cudaError err, const char *file, const int line )
{
if(cudaSuccess != err)
{
fprintf(stderr, "%s(%i) : CUDA Runtime API error %d: %s.\n",file, line, (int)err, cudaGetErrorString( err ) …Run Code Online (Sandbox Code Playgroud) 我对这个基本的CUDA代码感到烦恼.
我有一个char**平面的2d密码数组,我目前的实现是CUDA只是迭代这个列表并显示密码.但是,当我去显示它们时,我只是得到"(NULL)".我不太清楚为什么会这样.有人可以解释它发生了什么吗?
主要:
char ** pwdAry;
pwdAry = new char *[numberOfPwd];
//pwdAry given some values (flat 2d array layout)
const int pwdArySize = sizeof(pwdAry);
dim3 grid(gridSize,gridSize);
dim3 block(blockSize,blockSize);
searchKeywordKernel << <grid, block >> >(pwdAry);
return EXIT_SUCCESS;
Run Code Online (Sandbox Code Playgroud)
CUDA:
__global__ void searchKeywordKernel(char **passwordList)
{
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
int pitch = blockDim.x * gridDim.x;
int idx = x + y * pitch;
int tidy = idx / pitch; …Run Code Online (Sandbox Code Playgroud) 在Udacity的测验:线程和块"并行编程简介"中,它询问语句"在给定SM上运行的所有线程可以合作解决问题"是真还是假.答案是错误的,但我认为应该是真的,因为:
我有什么误解吗?
我是pytorch的新手.我从这个存储库中获取了代码https://github.com/ruotianluo/ImageCaptioning.pytorch,并希望为图像制作标题.安装"CUDA",当我运行脚本来创建注释时,会产生以下结果:
$ CUDA_LAUNCH_BLOCKING = 1条蟒蛇eval.py --model model.pth - -infos_path infos.pkl --image_folder等等--num_images 1 /home/azat/anaconda2/lib/python2.7/site-packages/h5py/ 初始化的.py :36:FutureWarning:不推荐将issubdtype的第二个参数从
floatto 转换为np.floating.在将来,它将被视为np.float64 == np.dtype (float) .type.从进口._conv作为register_converters _register_converters /home/azat/anaconda2/lib/python2.7/site-packages/torch/cuda/ INIT的.py:97:UserWarning:实测值GPU0的GeForce 820M是CUDA能力2.1.PyTorch不再支持这款GPU,因为它太旧了.warnings.warn(old_gpu_warn%(d,name,major,capability 1))DataLoaderRaw从文件夹加载图片:blah 0列出目录中的所有图像blah DataLoaderRaw找到8张图片THCudaCheck FAIL文件=/pytorch/torch/lib/THC/generic/THCTensorMathPairwise.cu line = 40 error = 48:没有内核映像可用于设备Traceback(最近一次最后一次调用):文件"eval.py",第122行,在vars(opt)中文件"/ home/azat/Programing/Python/techno_atom_neuro/Others Implementation/ImageCaptioning.pytorch-master/eval_utils.py",第82行,在eval_split中data = loader.get_batch(split)文件"/ home/azat/Programing/Python/techno_atom_neuro/Others实现/ ImageCaptioning.pytorch-master/dataloaderraw.py",第112行,在get_batch img = Variable(preprocess(img),volatile = True)文件"/home/azat/anaconda2/lib/python2.7/site-packages/torchvision /transforms/transforms.py",第42行,在调用 img = t(img)文件"/home/azat/anaconda2/lib/python2.7/ site-packages/torchvision/transforms/transforms.py",第118行,在调用 返回F.normalize(tensor,self.mean,self.std)文件"/home/azat/anaconda2/lib/python2.7/site- packages/torchvision/transforms/functional.py",第161行,标准化t.sub_(m).div_(s)RuntimeError:cuda运行时错误(48):没有内核映像可以在/ pytorch /上的设备上执行火炬/ lib目录/ THC /通用/ THCTensorMathPairwise.cu:40
所以,我想知道这个错误是什么,硬件或软件.我该如何解决这个问题呢.谢谢.
PyTorch
OS: Ubuntu 16.04
PyTorch version: 0.3.1 pip …Run Code Online (Sandbox Code Playgroud) 在我的cuda设备代码中,我正在检查,其中我减去线程的id和blockDim以查看天气与否,我可能想要使用的数据在范围内.但是当这个数字低于0时,它似乎又回到了最大值.
#include <iostream>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
float input[] =
{
1.5f, 2.5f, 3.5f,
4.5f, 5.5f, 6.5f,
7.5f, 8.5f, 9.5f,
};
__global__ void underflowCausingFunction(float* in, float* out)
{
int id = (blockDim.x * blockIdx.x) + threadIdx.x;
out[id] = id - blockDim.x;
}
int main()
{
float* in;
float* out;
cudaMalloc(&in, sizeof(float) * 9);
cudaMemcpy(in, input, sizeof(float) * 9, cudaMemcpyHostToDevice);
cudaMalloc(&out, sizeof(float) * 9);
underflowCausingFunction<<<3, 3>>>(in, out);
float recivedOut[9];
cudaMemcpy(recivedOut, out, sizeof(float) * 9, cudaMemcpyDeviceToHost);
cudaDeviceSynchronize();
std::cout << recivedOut[0] << " …Run Code Online (Sandbox Code Playgroud) 我的代码执行4x4矩阵求反(128、256、512)数时,遇到了精度问题。当我使用原始版本(即numpy函数np.linalg.inv或)时np.linalg.pinv,一切正常。
不幸的是,使用下面的CUDA代码,我将nan和inf值转换为倒置矩阵。
更明确地说,我将此矩阵求反:
2.120771107884677649e+09 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
0.000000000000000000e+00 3.557266600921528288e+27 3.557266600921528041e+07 3.557266600921528320e+17
0.000000000000000000e+00 3.557266600921528041e+07 3.557266600921528288e+27 3.557266600921528041e+07
0.000000000000000000e+00 3.557266600921528320e+17 3.557266600921528041e+07 1.778633300460764144e+27
Run Code Online (Sandbox Code Playgroud)
如果使用经典的numpy“ inv”,则会得到以下3x3倒置矩阵:
4.715266047722758306e-10 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
0.000000000000000000e+00 2.811147187396482366e-28 -2.811147186834252285e-48 -5.622294374792964645e-38
0.000000000000000000e+00 -2.811147186834252285e-48 2.811147187396482366e-28 -5.622294374230735768e-48
0.000000000000000000e+00 -5.622294374792964645e-38 -5.622294374230735768e-48 5.622294374792964732e-28
Run Code Online (Sandbox Code Playgroud)
为了检查该逆矩阵的有效性,我将其乘以原始矩阵,结果是单位矩阵。
但是使用CUDA GPU反转后,我得到了以下矩阵:
0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00
-inf -inf -9.373764907941219970e-01 -inf
inf nan -inf nan
Run Code Online (Sandbox Code Playgroud)
所以,我想竟被以提高精度到我的CUDA内核或Python代码,以避免这些nan和inf值。
这是CUDA内核代码,并调用了我的主要代码的一部分(我已经用numpy inv函数注释了经典方法:
# Create arrayFullCross_vec array
arrayFullCross_vec = np.zeros((dimBlocks,dimBlocks,integ_prec,integ_prec)) …Run Code Online (Sandbox Code Playgroud)