我很快将负责使用C/C++编写的代码的正确内存配置文件,并使用CUDA来利用GPU处理.
我最初的想法是创建宏和运算符重载,这将允许我在源代码中跟踪对malloc,free,delete和new调用的调用.我只能包含一个不同的标题,并使用__FILE__ and __LINE__宏来打印日志文件的内存调用.这种策略可以在这里找到:http://www.almostinfinite.com/memtrack.html
在链接的第三方库中跟踪该用法的最佳方法是什么?我假设我几乎只能在函数调用之前和之后跟踪内存使用情况,对吗?在我的宏/过载场景中,我可以简单地跟踪请求的大小,以确定要求的内存量.我怎样才能知道第三方lib正在使用多少?我的理解是,跟踪"免费"并不能真正让您了解代码在任何特定时间使用了多少,因为它不一定返回到操作系统.我很感激对此事的任何讨论.
我真的不想使用任何内存分析工具,如Totalview或valgrind,因为它们通常做很多其他事情(边界检查等)似乎使软件运行速度非常慢.另一个原因是我希望这有点线程安全 - 软件使用MPI我相信产生进程.我将尝试实时分析这个,以便我可以转储到日志文件或其他进程可以读取的内容,以便在软件运行时可视化内存使用情况.这也主要是在linux环境中运行.
谢谢
我将项目设置如下.我想删除一个项目,我得到以下内容:
2010-09-29 11:45:22,902 [http-8080-1] ERROR errors.GrailsExceptionResolver - deleted object would be re-saved by cascade (remove deleted object from associatio
ns): [Project#204]
org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [Project#204]
at ProjectController$_closure6.doCall(ProjectController:50)
at ProjectController$_closure6.doCall(ProjectController)
at org.jsecurity.web.servlet.JSecurityFilter.doFilterInternal(JSecurityFilter.java:382)
at org.jsecurity.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:180)
at java.lang.Thread.run(Thread.java:619)
Run Code Online (Sandbox Code Playgroud)
有没有办法让hibernate告诉我哪个对象有引用回到将被重新保存的Project对象.我的项目设置导致此循环异常有什么问题?
public class Project implements Comparable
{
static belongsTo = [employee:Employee]
static hasMany = [roles:Role]
static constraints = {
}
static mapping = {
description type:"text"
roles lazy:false, cascade:"all,delete-orphan"
client lazy:false, cascade:"all,delete-orphan"
employer lazy:false, cascade:"all,delete-orphan" …Run Code Online (Sandbox Code Playgroud) 我一直在试图弄清楚如何制作我认为是一个简单的内核来获取2d矩阵中的值的平均值,但是我有一些问题让我的思维过程直接进行.
根据我的deviceQuery输出,我的GPU有16MP,32cores/mp,块最大为1024x1024x64,我有一个最大线程/块= 1024.
所以,我正在处理一些大型图像.也许5000px x 3500px或类似的东西.我的一个内核是在图像中的所有像素上取平均值.
现有代码将图像存储为2D数组[rows] [cols].因此,在C中,内核看起来像你期望的那样,循环遍历行,并且循环遍历cols,计算在中间.
那么如何在CUDA中设置此代码的维度计算部分?我已经查看了SDK中的缩减代码,但这是针对单维数组的.它没有提到如何设置块数和线程数,当你有soemthing 2D时.
我想我实际上需要像这样设置它,这就是我希望有人能够帮助你的地方:
num_threads=1024;
blocksX = num_cols/sqrt(num_threads);
blocksY = num_rows/sqrt(num_threads);
num_blocks = (num_rows*num_cols)/(blocksX*blocksY);
dim3 dimBlock(blocksX, blocksY, 1);
dim3 dimGrid(num_blocks, 1, 1);
Run Code Online (Sandbox Code Playgroud)
这似乎对设置有意义吗?
然后在内核中,要处理特定的行或列,我必须使用
rowidx =(blockIdx.x*blockDim.x)+ threadId.x colidx =(blockIdx.y*blockDim.y)+ threadId.y
至少我认为这对于获得行和列是有效的.
那么我如何访问内核中的特定行r和列c?在cuda编程指南中,我找到了以下代码:
// Host code int width = 64, height = 64;
float* devPtr; size_t pitch;
cudaMallocPitch(&devPtr, &pitch, width * sizeof(float), height);
MyKernel<<<100, 512>>>(devPtr, pitch, width, height);
// Device code __global__ void MyKernel(float* devPtr, size_t pitch, int width, int height)
{
for (int …Run Code Online (Sandbox Code Playgroud) 在我在下面发布的char中,我将比较FFTW和CUFFT中的IFFT运行结果.
出现这种情况的可能原因有何不同?真的那么多错误吗?
以下是相关的代码段:
cufftHandle plan;
cufftComplex *d_data;
cufftComplex *h_data;
cudaMalloc((void**)&d_data, sizeof(cufftComplex)*W);
complex<float> *temp = (complex<float>*)fftwf_malloc(sizeof(fftwf_complex) * W);
h_data = (cufftComplex *)malloc(sizeof(cufftComplex)*W);
memset(h_data, 0, W*sizeof(cufftComplex));
/* Create a 1D FFT plan. */
cufftPlan1d(&plan, W, CUFFT_C2C, 1);
if (!reader->getData(rowBuff, row))
return 0;
// copy from read buffer to our FFT input buffer
memcpy(indata, rowBuff, fCols * sizeof(complex<float>));
for(int c = 0; c < W; c++)
h_data[c] = make_cuComplex(indata[c].real(), indata[c].imag());
cutilSafeCall(cudaMemcpy(d_data, h_data, W* sizeof(cufftComplex), cudaMemcpyHostToDevice));
cufftExecC2C(plan, d_data, d_data, CUFFT_INVERSE);
cutilSafeCall(cudaMemcpy(h_data, d_data,W * sizeof(cufftComplex), …Run Code Online (Sandbox Code Playgroud) 我写了一个简单的测试程序,我正在做复杂到复杂的FT,我只生成了一些数据1..50并将其插入到数组的每个索引的实部和虚部.
当我做这样的操作IFFT(FFT(A))= A.
为了测试它们,我得到了每个库的不同结果.
FFTW,我必须将输出除以len(A)以取回原始A.
然而,执行此操作然后使用CUFFT反向FFT,看起来我必须除以(sqrt(2)*50)以返回原始数据.
这个额外的平方根因子来自哪里?
根据CUFFT文档:CUFFT执行非标准化FFT; 也就是说,对输入数据集执行前向FFT,然后对得到的集合进行逆FFT,产生的数据等于按元素数量缩放的输入.通过数据集的大小的倒数来缩放变换,留给用户按照看到的拟合执行.
提前致谢
我试图弄清楚如何在我当前在 QGraphicsView 中看到的像素与图像中作为 QGraphicsItem 的实际像素之间进行映射。
例如,如果我的查看器为 50x50,而我的图像为 100x100,则当图像加载且未更改时,图像的 0,0 像素对应于查看器的 0,0 像素。
现在,如果我将图像向右拖动 10 个像素,则图像左上角的 0,0 像素现在位于 (10,0),并且我只能看到原始图像的第 10-40 列。
另外,如果我缩放到缩小,使图像小于 QGraphicsView 区域,也许图像的 0,0 映射到查看器中的 10,0,但图像的 100,100 可能只映射到查看器中的 40,40 ,因为我把它缩放得太小了。
我知道 QGraphicsItem 有很多映射函数,但我不确定如何检测哪些部分可见,以及如何在项目、场景和视图之间进行映射。
谢谢你的帮助
作为参考..到目前为止,这是我尝试过的:获取项目形状将形状映射到场景映射,使用视图从场景获取路径的边界矩形并找到该路径的左上角
最终使用了类似下面的东西:
QRect portRect = ui->graphicsView->viewport()->rect();
QRectF sceneRect = ui->graphicsView->mapToScene(portRect).boundingRect();
QRectF itemRect = item->mapRectFromScene(sceneRect);
QRectF isec = itemRect.intersected(item->boundingRect());
Run Code Online (Sandbox Code Playgroud)
谢谢朱棣文
我有一些代码想要制作成 cuda 内核。看:
for (r = Y; r < Y + H; r+=2)
{
ch1RowSum = ch2RowSum = ch3RowSum = 0;
for (c = X; c < X + W; c+=2)
{
chan1Value = //some calc'd value
chan3Value = //some calc'd value
chan2Value = //some calc'd value
ch2RowSum += chan2Value;
ch3RowSum += chan3Value;
ch1RowSum += chan1Value;
}
ch1Mean += ch1RowSum / W;
ch2Mean += ch2RowSum / W;
ch3Mean += ch3RowSum / W;
}
Run Code Online (Sandbox Code Playgroud)
是否应该将其分成两个内核,一个用于计算 RowSums,另一个用于计算平均值,我应该如何处理循环索引不是从零开始并以 N 结束的事实?
我试图弄清楚如何将matlab中的del2()函数移植到C++.
我有几个我正在使用的面具是零和零,所以我写了代码:
for(size_t i = 1 ; i < nmax-1 ; i++)
{
for(size_t j = 1 ; j < nmax-1 ; j++)
{
transmask[i*nmax+j] = .25*(posmask[(i+1)*nmax + j]+posmask[(i-1)*nmax+j]+posmask[i*nmax+(j+1)]+posmask[i*nmax+(j-1)]);
}
}
Run Code Online (Sandbox Code Playgroud)
计算拉普拉斯的内部点.我认为根据matlab中"doc del2"中的一些信息,边界条件只是使用可用的信息来计算,对吧?所以我想我只需要为i,j = 0和nmax的边界条件写出个案
但是,我认为我在这里发布的代码中的这些值对于内部点是正确的,但看起来del2结果是不同的!
我挖掘了del2源码,我想我还不够matlab向导来弄清楚内部计算的一些代码是怎么回事
我有一个cuda代码,我已经实现了几个C2C 2D FFT.它们都使用相同的计划,但由于某种原因,2D FFT的时间很长,而且似乎变化很大.相同的数据大小FFT似乎需要0.4s到1.8s
这适用于1920x1080 FFT.那些时候看起来合理吗?
无论如何 - 我对CUDA 1-D批量FFT的快速体验有很好的经验.在行中采用一维FFT是否相同,然后在矩阵的列上再次得到与此二维FFT相同的结果?对于1D FFT之前的数据集,我经历过几秒钟内发生的FFT,因此我希望能够修复其中的一些结果.
谢谢
我正在使用一个应用程序,它产生了一堆pthreads(linux),每个都创建了它自己的CUDA上下文.(现在使用cuda 3.2).
我遇到的问题是,似乎每个线程都有自己的上下文在GPU上花费了大量内存.每个线程大约200MB,所以这真的限制了我.
我可以简单地在主机线程中创建流,将流引用传递给工作线程,然后工作线程可以将它们的流编号传递给我的CUDA库,并且所有工作都在同一个上下文中工作吗?
工作线程是否自动知道与其父线程相同的CUDA上下文?
谢谢