我正在尝试在shell脚本中生成动态var名称,以在循环中处理一组具有不同名称的文件,如下所示:
#!/bin/bash
SAMPLE1='1-first.with.custom.name'
SAMPLE2='2-second.with.custom.name'
for (( i = 1; i <= 2; i++ ))
do
echo SAMPLE{$i}
done
Run Code Online (Sandbox Code Playgroud)
我期待输出:
1-first.with.custom.name
2-second.with.custom.name
Run Code Online (Sandbox Code Playgroud)
但我得到了:
SAMPLE{1}
SAMPLE{2}
Run Code Online (Sandbox Code Playgroud)
是否有可能在飞行中生成var名称?
我一直在使用线性共享内存(加载,存储,访问邻居),但我在2D中进行了一个简单的测试来研究银行冲突,结果让我感到困惑.
下一个代码将数据从一维全局存储器阵列读取到共享存储器,并将其从共享存储器复制回全局存储器.
__global__ void update(int* gIn, int* gOut, int w) {
// shared memory space
__shared__ int shData[16][16];
// map from threadIdx/BlockIdx to data position
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
// calculate the global id into the one dimensional array
int gid = x + y * w;
// load shared memory
shData[threadIdx.x][threadIdx.y] = gIn[gid];
// synchronize threads not really needed but keep it for convenience
__syncthreads();
// write …
Run Code Online (Sandbox Code Playgroud) 当我将数组绑定到CUDA中的纹理时,
如果答案是1.,那么我可以从纹理存储空间绑定纹理和安全获取数据,同时将结果写入数组,该数组在全局存储器中分配.
如果答案是2.那么纹理存储器是一个全局存储空间,数据被缓存并空间获取?
我想知道这个话题,因为我已经看到了一些与这个话题相关的问题,我现在还没有明确答案.
提前致谢.
我正在使用CUDA进行图像处理,我对像素处理有疑问.
应用m x m
卷积滤波器时,通常使用图像的边界像素做什么?
在3 x 3
卷积内核中,忽略1
图像的像素边界更容易处理,尤其是在使用共享内存改进代码时.实际上,在这种情况下,不需要检查给定像素是否具有所有可用的(0, 0)
邻域(即,在coord处的像素没有离开,左上,上邻居).但是,删除1
原始图像的像素边界可能会产生部分结果.
与此相反,我想处理图像中的所有像素,也就是在使用共享内存改进时,即加载16 x 16
像素,但计算内部14 x 14
.同样在这种情况下,忽略边界像素会产生更清晰的代码.
在这种情况下通常做什么?
是否有人通常使用我的方法忽略边界像素?
当然,我知道答案取决于问题的类型,即以像素方式添加两个图像没有这个问题.
提前致谢.
我准备了一个.pro文件,用于在Linux机器(64位)中使用Qt和CUDA.当我将应用程序运行到CUDA探查器中时,应用程序执行12次,但在出现结果之前,我得到下一个错误:
对于列'内存传输大小,在第6行的探查器数据文件'/home/myusername/development/qtspace/bin/temp_compute_profiler_0_0.csv'中出错.
main.cpp文件很简单
#include <QtCore/QCoreApplication>
extern "C"
void runCudaPart();
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
runCudaPart();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
事实是,如果我删除"QCoreApplication a(argc,argv);" 将CUDA Visual Profiler作为例外工作并显示所有结果.
我已经检查过,如果我导出CUDA_PROFILE = 1环境变量,则从命令行生成cuda_profile.log.如果我导出COMPUTE_PROFILE_CSV = 1变量但是当我尝试导入该文件时CUDA Visual Profiler崩溃,也会生成逗号分隔文件.
关于这个问题的任何提示?它似乎与CUDA visual Profiler应用程序有关,而不是代码.
如果你想知道为什么我用Qt做了这么简单的main.cpp但没有使用Qt:P是我希望将来改进框架来添加GUI.
// CUDA,GPU,OS,QT和编译器版本的详细信息
Device"GeForce GTX 480"
CUDA Driver Version: 3.20
CUDA Runtime Version: 3.20
CUDA Capability Major/Minor version number: 2.0
OS: ubuntu 10.04 LTS
QT_VERSION: 263682
QT_VERSION_STR: 4.6.2
gcc version 4.4.3
nvcc compilation tool, release 3.2, V0.2.122
Run Code Online (Sandbox Code Playgroud)
我注意到问题在于QCoreApplication构造.它与参数有关.如果我将该行修改为:
QCoreApplication …
Run Code Online (Sandbox Code Playgroud) 我做了一个简单的texture3D测试,并在将数据复制到设备时发现了一种奇怪的行为.函数cudaMemcpy3D返回'无效参数'.
我发现问题与cudaExtent有关.根据CUDA工具包参考手册4.0,cudaExtent参数如下:
所以,我准备了如下纹理:
// prepare texture
cudaChannelFormatDesc t_desc = cudaCreateChannelDesc<baseType>();
// CUDA extent parameters w - Width in bytes, h - Height in elements, d - Depth in elements
cudaExtent t_extent = make_cudaExtent(NCOLS*sizeof(baseType), NROWS, DEPTH);
// CUDA arrays are opaque memory layouts optimized for texture fetching
cudaArray *i_ArrayPtr = NULL;
// allocate 3D
status = cudaMalloc3DArray(&i_ArrayPtr, &t_desc, t_extent);
Run Code Online (Sandbox Code Playgroud)
并配置3D参数如下:
// prepare input data
cudaMemcpy3DParms i_3DParms = { 0 }; …
Run Code Online (Sandbox Code Playgroud) 从linux中的命令行启动matlab时,我有一种奇怪的行为.
我在linux中有一个bash脚本,它从命令行在matlab中执行一个函数,并使用C++编写的自定义函数执行其他操作,如下所示:
#!/bin/bash
# prepare input data just to be sure it has not been written by other test!
matlab2011a -nodesktop -nosplash -r "prepare_data_matlab( 'A' ); quit"
# launch C++ program
...
# prepare more data
matlab2011a -nodesktop -nosplash -r "prepare_data_matlab( 'B' ); quit"
Run Code Online (Sandbox Code Playgroud)
当脚本完成后,虽然命令有效,但我看不到我在终端写的内容.我需要到reset
终端.
事实上,如果我只使用matlab启动matlab,一切正常,prepare_data_matlab( 'A' )
但是当我执行带有选项的函数时问题就出现了prepare_data_matlab( 'B' )
.
我逐行评论,发现问题是B
调用函数的选项
dlmwrite(file_name, B, ' ');
Run Code Online (Sandbox Code Playgroud)
不用于prepare_data_matlab( 'A' )
.
那么,我应该如何从命令行执行matlab以避免这种行为?该dlmwrite()
功能是否存在已知错误?
我正在使用Ubuntu 12.04 64位,GNU bash,versión4.2.24 (1)-release(x86_64-pc-linux-gnu)和matlab2011a …
这个问题源于在内核中观察到的理论占用率和实现占用率之间的差异。我知道的计算器之间和不同nvprof占用和也约约从块CUDA分布于短信的细节的一个问题。
让我们考虑一个具有计算能力 = 6.1 和 15 个 SM(GTX TITAN、Pascal 架构、芯片组 GP104)的 GPU。让我们考虑一个 2304 个元素的小问题。
如果我们将内核配置为 512 个线程,那么每个线程将处理一个元素,我们需要 5 个块来处理所有数据。并且内核非常小,因此在使用资源方面没有任何限制,无论是寄存器还是共享内存。
因此,理论上的占用率为 1,因为可以在一个 SM(2048 个线程)中分配四个并发块,从而导致 2048 / 32 = 64 个活动扭曲(最大值)。
然而,达到的占用率(由 nvidia profiler 报告)为 ~0.215,这可能与块映射到 SM 的方式有关。那么,当块的数量少于可用的 SM 时,如何将它们调度到 CUDA 中的 SM 中?
选项 1.-将 4 个 512 个线程块调度到一个 SM 中,将 1 个 512 个线程块调度到另一个 SM 中。在这种情况下,入住率将为 (1 + 0.125) / 2 = 0.56。我假设最后一个块只有 512 个线程中的 256 个处于活动状态以到达数组的最后 256 个元素,并且它在第二个 SM 中分配。因此,考虑到扭曲粒度,只有 8 个扭曲是活动的。
选项 2.- …
声明的含义是什么
// create arrays of 1M elements
const int num_elements = 1<<20;
Run Code Online (Sandbox Code Playgroud)
在下面的代码中?它特定于CUDA还是可以在标准C中使用?
当我printf
编辑num_elements时,我得到num_elements == 1048576
原来是2 ^ 20。那么<<操作符是C取幂的简写吗?
// This example demonstrates parallel floating point vector
// addition with a simple __global__ function.
#include <stdlib.h>
#include <stdio.h>
// this kernel computes the vector sum c = a + b
// each thread performs one pair-wise addition
__global__ void vector_add(const float *a,
const float *b,
float *c,
const size_t n)
{
// compute the global element index this …
Run Code Online (Sandbox Code Playgroud) 我在我编写的一段代码中发现了一个奇怪的行为,当我尝试从程序中重现它时(即使用MATLAB),这种行为不会发生.
我正在对数组进行如下操作:
a[i] = a[i] / (sqrt(b[i]) * sqrt(c[i]));
Run Code Online (Sandbox Code Playgroud)
其中a
,b
和c
是float类型的阵列.的值a
,b
和c
来自先前分割范围2000
到6000000
对于数组的所有元素,操作的结果为零,但是分别查看分子和分母的值,对于给定元素,操作89509.0 / 90240,375
等于0,991895258
.
所以,我想知道为什么使用float的程序中的完整操作不起作用,并且它按预期单独工作.可能是因为几个小时的混淆调试?
我正在分析一个内核,该内核在 GTX480 中每个线程使用 25 个寄存器,每个块使用 3568 字节的共享内存。内核配置为启动 16x16 线程,线程缓存首选项设置为共享。
根据 GTX480 的规格,该设备每个 SM 有 32768 个寄存器,因此可以25 regs x 256 threads per block x 6 blocks per SM
同时运行多个块。
但是,Compute Visual Profiler 和 Cuda Occupancy Calculator 报告每个 SM 只有 4 个块将处于活动状态。我想知道为什么只有 4 个块会处于活动状态,而不是我预期的 5 个。
我发现的原因是 CUDA 将使用的寄存器数量向上舍入为 26,在这种情况下,活动块的数量为 4。
为什么 CUDA 对寄存器的数量进行四舍五入?因为每个线程有 25 个寄存器,每个块有 256 个线程,所以每个 SM 最多可以有 5 个块,这显然是一个优势。
环境设置:
Device 0: "GeForce GTX 480"
CUDA Driver Version / Runtime Version 5.0 / 4.0
ptxas info: Compiling entry …
Run Code Online (Sandbox Code Playgroud) OpenCV原语是否基于CUDA Nvidia Performance Primitives(NPP)?
原语我的意思是在NPP库中实现的相同,例如:boxFilter,Mirror,Convolution ......
我想知道这个问题,因为我正计划使用NPP库.但是,OpenCV具有更多功能,可以帮助我进行图像处理的边界处理.
如何为文件夹中已存在的文件编写规则以指向不同的位置。例如,用于将文件wp-content/uploads/
夹中对pdf 文件的任何请求重写为页面download/?q=$1
。
我在 SO 中看到了一个有关移动 pdf 文件的相关问题,其中包含以下内容
# checks that the request is for a file that *does not* exist
RewriteCond %{REQUEST_FILENAME} !-f
# make sure we've not already redirected to the uploads directory
# (in case it doesn't exist in there either)
RewriteCond %{REQUEST_URI} !^/wp-content/uploads/
# the rule matches against either pdf, zip or xls.
RewriteRule ([^/]*\.(pdf|zip|xls))$ /wp-content/uploads/$1 [NC,L,R=301]
Run Code Online (Sandbox Code Playgroud)
但我想要相反的效果。对我现有的文件进行重定向,并为不存在的文件保留 404 not found。
我尝试了不同的方法,但没有运气。想知道.htaccess
根文件夹中的WordPress默认文件是否干扰了这个。如何将pdf的所有请求重写为自定义页面?
编辑:
该.htaccess
文件位于wp-content/uploads …