为了记录这是家庭作业,所以尽量少帮助.我们使用常量存储器来存储"掩模矩阵",该掩模矩阵将用于在更大的矩阵上执行卷积.当我在主机代码中时,我使用cudaMemcpyToSymbol()将掩码复制到常量内存.
我的问题是,一旦将其复制并启动我的设备内核代码,设备如何知道访问常量内存掩码矩阵的位置.在内核启动时是否需要传入指针.教授给我们的大部分代码都不应该被改变(没有指向传入掩码的指针)但总是有可能他犯了一个错误(虽然这很可能是我对某些东西的理解)
是否应该将常量的memeory declaratoin包含在单独的kernel.cu文件中?
我正在最小化代码,只显示与常量内存有关的事情.因此,请不要指出是否有什么东西没有初始化等.有代码,但目前不关心.
main.cu:
#include <stdio.h>
#include "kernel.cu"
__constant__ float M_d[FILTER_SIZE * FILTER_SIZE];
int main(int argc, char* argv[])
{
Matrix M_h, N_h, P_h; // M: filter, N: input image, P: output image
/* Allocate host memory */
M_h = allocateMatrix(FILTER_SIZE, FILTER_SIZE);
N_h = allocateMatrix(imageHeight, imageWidth);
P_h = allocateMatrix(imageHeight, imageWidth);
/* Initialize filter and images */
initMatrix(M_h);
initMatrix(N_h);
cudaError_t cudda_ret = cudaMemcpyToSymbol(M_d, M_h.elements, M_h.height * M_h.width * sizeof(float), 0, cudaMemcpyHostToDevice);
//char* cudda_ret_pointer = cudaGetErrorString(cudda_ret);
if( cudda_ret != cudaSuccess){
printf("\n\ncudaMemcpyToSymbol …Run Code Online (Sandbox Code Playgroud) 所以我正在阅读Robert Laganiere的"OpenCV 2计算机视觉应用程序编程手册".在第42页左右,它讨论的是图像缩减算法.我理解算法(我认为),但我不明白为什么要放入一个部分.我想我知道为什么,但如果我错了,我想纠正.我将在这里复制并粘贴一点:
"彩色图像由3通道像素组成.这些通道中的每一个都对应于三原色之一(红色,绿色,蓝色)的强度值.由于这些值中的每一个都是8位无符号字符,因此总数颜色数量是256x256x256,超过1600万种颜色.因此,为了降低分析的复杂性,减少图像中的颜色数量有时是有用的.实现这一目标的一个简单方法是简单地细分将RGB空间转换为相同大小的立方体.例如,如果将每个维度中的颜色数量减少8,那么您将获得总共32x32x32颜色.然后为原始图像中的每种颜色分配一个颜色的新颜色值 - 减少的图像,它对应于它所属的立方体中心的值.因此,基本的颜色减少算法很简单.如果N是缩减因子,那么对于图像中的每个像素和该像素的每个通道,将值除以N(整数 分裂,因此提醒丢失).然后将结果乘以N,这将为您提供输入像素值下方的N的倍数.只需添加N/2即可获得两个相邻N的倍数之间的间隔的中心位置.如果对每个8位通道值重复此过程,则将获得总共256/N x 256/N x 256/N可能的颜色值.怎么做...我们的色彩还原功能的签名如下:void colorReduce(cv :: Mat&image,int div = 64); 用户提供图像和每通道缩减因子.这里,处理是就地完成的,即通过函数修改输入图像的像素值.有关具有输入和输出参数的更通用的函数签名,请参阅此配方的"还有更多..."部分.只需创建一个覆盖所有像素值的双循环即可完成处理:"
void colorReduce(cv::Mat &image, int div=64) {
int nl= image.rows; // number of lines
// total number of elements per line
int nc= image.cols * image.channels();
for (int j=0; j<nl; j++) {
// get the address of row j
uchar* data= image.ptr<uchar>(j);
for (int i=0; i<nc; i++) {
// process each pixel ---------------------
data[i]=
data[i]/div*div + div/2;// <-HERE IS WHERE I NEED UNDERSTANDING!!! …Run Code Online (Sandbox Code Playgroud) 所以我试图在 bash 脚本中执行 if else if else 语句。截至目前,当我运行此脚本时,我收到以下错误消息“./groupJobs.sh:第 76 行:意外标记附近的语法错误elif'
./groupJobs.sh: line 76:elif [ $jobsize -lt $2 ]; then'”
我在网上查看了多个示例,但看不出我所做的和其他人所说的有什么不同。
任何帮助,将不胜感激。(第 76 行是最后一个 elif 语句)
if [ $filesize -ge $2 ]; then
#goes this way if file is to big to put in a job with anyother files
$filename >> $jobname$jobnumber;
elif [ $jobsize -ge $2 ]; then
#job is done being created
elif [ $jobsize -lt $2 ]; then
#add file to job and move on to …Run Code Online (Sandbox Code Playgroud) 因此,由于某种原因,我无法理解为什么测试和测试和设置功能比标题中指定的书中的测试和设置功能更快的完整概念.让我详细说说.......
在附录中的上述参考书中,它进入了计算机体系结构.我已经很好地掌握了这一点.接下来总结一下,由于缓存,TTAS比TAS功能更快.我不明白这是怎么回事.TTAS功能不会像TAS功能那样缓存.TAS功能的哪个部分导致其工作时间更长或导致TTAS功能更短的原因.