已知主机上的一个二维unity 矩阵传入shader,如何传入到cuda上?

CUDA&C&Runtime介绍&函数、数组空间分配
//&Device&code&&&&
__global__&void&VecAdd(float&*A,&float&*B,&float&*C,&int&N)&{&&&&
&&&&int&i&=&blockDim.x&*&blockIdx.x&+&threadIdx.x;&&&&
&&&&if&(i&&&N)&&&&
&&&&&&&&C[i]&=&A[i]&+&B[i];&&&&
//&Host&code&&&&
int&main()&{&&&&
&&&&int&N&=&...;&&&&
&&&&size_t&size&=&N&*&sizeof(float);&&&&
&&&&//&Allocate&input&vectors&h_A&and&h_B&in&host&memory&&&&
&&&&float&*h_A&=&(float*)malloc(size);
& &//在CPU中申请内存
&&&&float&*h_B&=&(float*)malloc(size);&&&&
&&&&//&Initialize&input&vectors&&&&
&&&&...&&&&
&&&&//&Allocate&vectors&in&device&memory&&&&
&&&&float&*d_A,&*d_B,&*d_C;&&&&
&&&&cudaMalloc(&d_A,&size);
&//在设备中申请内存
&&&&cudaMalloc(&d_B,&size);&&&&
&&&&cudaMalloc(&d_C,&size);&&&&
&&&&//&Copy&vectors&from&host&memory&to&device&memory&&&&
//cudamemcpy(目的,源,大小,谁到谁)
&&&&cudaMemcpy(d_A,&h_A,&size,&cudaMemcpyHostToDevice);&&&&
&&&&cudaMemcpy(d_B,&h_B,&size,&cudaMemcpyHostToDevice);&&&&
&&&&//&Invoke&kernel&&&&
&&&&int&threadsPerBlock&=&256;&&&&
&&&&int&blocksPerGrid&=&(N&+threadsPerBlock&-&1)&/&threadsPerB&&&&
&&&&VecAdd&&&&(d_A,&d_B,&d_C,&N);&&&&
&&&&//&Copy&result&from&device&memory&to&host&Memory&&&&
&&&&cudaMemcpy(h_C,&d_C,&size,&cudaMemcpyDeviceToHost);&&&&
&&&&//&Free&device&memory&&&&
&&&&cudaFree(d_A);&&&&
&&&&cudaFree(d_B);&&&&
&&&&cudaFree(d_C);&&&&
&&&&//&Free&host&memory&&&&
&&&&...&&&&
片段展示了设备内存的分配,传输以及回收过程。
二维及三维的情况:
//&Host&code&&&&
int&width&=&64,&height&=&64;&&&&
float&*devP&&&&
size_t&&&&&
cudaMallocPitch(&devPtr,&&pitch,&width&*&sizeof(float),&height);&&&&
//分配二维数组空间pitch对齐用
MyKernel&&&100,&512&&&(devPtr,&pitch,&width,&height);&&&&
//&Device&code&&&&
__global__&void&MyKernel(float*&devPtr,&size_t&pitch,&int&width,&int&height)&{&&&&
&&&&for&(int&r&=&0;&r&&&&++r)&{&&&&
&&&&&&&&float*&row&=&(float*)((char*)devPtr&+&r&*&pitch);&&&&
&&&&&&&&for&(int&c&=&0;&c&&&&++c)&{&&&&
&&&&&&&&&&&&float&element&=&row[c];&&&&
&&&&&&&&}&&&&
Parameters:
- Pointer to allocated pitched device memory
- Pitch for allocation
- Requested pitched allocation width
- Requested pitched allocation height
Parameters:
- Destination memory address
- Pitch of destination memory
- Source memory address
- Pitch of source memory
- Width of matrix transfer (columns in bytes)
- Height of matrix transfer (rows)
- Type of transfer(,&,&,
//&Host&code&&&&
int&width&=&64,&height&=&64,&depth&=&64;&&&&
cudaExtent&extent&=&make_cudaExtent(width&*&sizeof(float),&height,&depth);&&&&
cudaPitchedPtr&devPitchedP&&&&
cudaMalloc3D(&devPitchedPtr,&extent);&&&&
//分配三维数组空间
MyKernel&&&100,&512&&&(devPitchedPtr,&width,&height,&depth);&&&&
//&Device&code&&&&
__global__&void&MyKernel(cudaPitchedPtr&devPitchedPtr,&int&width,&int&height,&int&depth)&{&&&&
&&&&char*&devPtr&=&devPitchedPtr.&&&&
&&&&size_t&pitch&=&devPitchedPtr.&&&&
&&&&size_t&slicePitch&=&pitch&*&&&&&
&&&&for&(int&z&=&0;&z&&&&++z)&{&&&&
&&&&&&&&char*&slice&=&devPtr&+&z&*&sliceP&&&&
&&&&&&&&for&(int&y&=&0;&y&&&&++y)&{&&&&
&&&&&&&&&&&&float*&row&=&(float*)(slice&+&y&*&pitch);&&&&
&&&&&&&&&&&&for&(int&x&=&0;&x&&&&++x)&&&&
&&&&&&&&&&&&&&&&float&element&=&row[x];&&&&
&&&&&&&&}&&&&
__constant__&float&constData[256];&&&&
float&data[256];&&&&
cudaMemcpyToSymbol(constData,&data,&sizeof(data));&&&&
cudaMemcpyFromSymbol(data,&constData,&sizeof(data));&&&&
&//注意区分to 与from
__device__&float&devD&&&&
float&value&=&3.14f;&&&&
cudaMemcpyToSymbol(devData,&&value,&sizeof(float));&&&&
__device__&float*&devP&&&&
float*&&&&&
cudaMalloc(&ptr,&256&*&sizeof(float));&&&&
cudaMemcpyToSymbol(devPointer,&&ptr,&sizeof(ptr));
使用cudaGetSymbolAddress()函数可以获得被声明存储在全局内存中的变量地址。为了获得分配内存的大小,可以使用cudaGetSymbolSize()函数。
全局存储器是分配的线性空间,一维空间可以通过
CUDAMalloc()函数分配,而通过CUDAFree()函数释发,同时使用cudaMemcpy()进行内存数据传输,用cudaMemset()进行初始化。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。二维数组的传输 (host &-& device)
时间: 16:36:14
&&&& 阅读:123
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&前言
  本文的目的很明确:介绍如何将二维数组传递进显存,以及如何将二维数组从显存传递回主机端。
  1. 在显存中为二维数组开辟空间
  2. 获取该二维数组在显存中的&pitch 值 (cudaMallocPitch 实现)
  3. 将二维数组传递进显存 (cudaMemcpy2D 实现)
  4. 在显存中对该二维数组进行处理 (目前必须按照 1 维数组的规则进行处理)
  5. 将结果传递回内存 (cudaMemcpy2D实现)
重要概念 - pitch
  对于内存的存取来说,对准偏移量为2的幂(现在一般要求2^4=16)的地址能获取更快的速度,而如果不对齐,可能你需要的数据需要更多的存取次数才能得到。
  为了满足这个条件,对于一个二维数组来说(行优先row major),就希望每一行的开头都满足&对齐&。如果一行的长度不规整,导致下一行开头不在指定的位置,就需要在每一行末尾进行填充(padding),从而使得每一行都对齐,这和BMP格式的像素存储是一个道理。
  pitch就是指每一行的字节数&+&padding的字节数&。
  使用&cudaMemcpy2D 的目的仅是为了利用 pitch 机制提升二维数组中元素的访问速度。事实上二维数组传递进显存后,还是得按照一维数组的规范去处理该二维矩阵。global 函数中目前不支持多下标访问,好坑。。
1 #include "cuda.h"
2 #include "cuda_runtime.h"
4 #include &iostream&
6 using namespace
8 // 定义测试二维数组的行列数
9 const int R = 5;
10 const int C = 10;
12 int main()
// 定义一个用于测试的二维数组,其每个元素都赋值为0,并将其打印出来。
int array2D[R][C];
cout && "传输前的测试矩阵:" &&
for (int i=0; i&R; i++) {
for (int j=0; j&C; j++) {
array2D[i][j] = 0;
cout && array2D[i][j] && " ";
// 再定义另一个同样大小的二维数组用于获取从显存传回的结果
int result[R][C];
cout && "传输前的结果矩阵:" &&
for (int i=0; i&R; i++) {
for (int j=0; j&C; j++) {
result[i][j] = 1;
cout && result[i][j] && " ";
// 为此二维数组在显存中分配内存
int *d_array2D;
cudaMalloc ((void**)&d_array2D, sizeof(int)*R*C);
// 获取显存中的二维数组的 pitch 值
cudaMallocPitch ((void**) &d_array2D, &d_pitch, sizeof(int)*C, R);
// 将二维数组转移进显存
cudaMemcpy2D (
d_array2D,
// 目的地址
// 目的 pitch
sizeof(int)*C,
// 源 pitch
sizeof(int)*C,
// 数据拷贝宽度
// 数据拷贝高度
cudaMemcpyHostToDevice
// 数据传递方向
// 将二维数组从显存传输回主机端的结果矩阵中
cudaMemcpy2D (
// 目的地址
sizeof(int)*C,
// 目的 pitch
d_array2D,
// 源 pitch
sizeof(int)*C,
// 数据拷贝宽度
// 数据拷贝高度
cudaMemcpyDeviceToHost
// 数据传递方向
// 打印传回到结果矩阵的数据
cout && "从显存获取到测试矩阵后的结果矩阵:" &&
for (int i=0; i&R; i++) {
for (int j=0; j&C; j++) {
cout && result[i][j] && " ";
cudaFree (d_array2D);
cin.get();
return EXIT_SUCCESS;
  本文介绍的仅仅是二维数组在两端之间的传输!当二维数组传递进了显存,在对其操作的过程中,是需要对其进行一个一维到二维的下标操作转换的,global 中不支持多下标访问。之所以加入 pitch 并使用 cudaMemcpy2D 只是为了提高元素的访问速度。
  如果需要具体处理传递进入的二维数组,还要将 pitch 也作为参数传递进 kernel 函数,如下所示:
// 下面的 kernel 函数将二维数组的所有位置为 2
__global__
void kernelFun (int *d_array2D, int pitch)
for (int i=0; i&R; i++) {
int *row = (int *)((char *)d_array2D+i*pitch);
for (int j=0; j&C; j++) {
row[j] = 2;
&标签:&&&&&&&&&&&&&&&&&&原文地址:http://www.cnblogs.com/scut-fm/p/3787957.html
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)I am using CUDA. I have the following class on host:
class Particle{
// several other variables
Then I have a vector of particles
vector &Particle& p_all(512);
On the GPU, I want to operate on an array of all x's (taken from all the Particles), and want to copy the data from the Particles array into a float array on device. I have a hunch that cudaMemcpy can be used, and I tried the following code, but it gives invalid pitch error.
cudaMalloc( (void**) &pos_dev, sizeof(float)*512);
cudaMemcpy2D( (void*) &pos_dev, sizeof(float), (void*)&p_all[0].x, sizeof(Particle), sizeof(Particle), 512*sizeof(float), cudaMemcpyHostToDevice);
Is it at all possible to do so? Of course, the backup solution is to create an array of x's using a for loop and then copy it to the device. But I am looking for a more efficient solution.
FULL CODE BELOW.
#include &cuda_runtime.h&
#include &iostream&
#include &vector&
// This will output the proper error string when calling cudaGetLastError
void getLastCudaError(string s=""){
string errMessage =
cudaError_t err = cudaGetLastError();
if( err != cudaSuccess){
cerr && __FILE__ && "(" && __LINE__ && ") : Last Cuda Error - " && errMessage
&& " (" && int(err) && "): " && cudaGetErrorString(err) && ".\n";
class Particle{
Particle(){
a=1988; c='a'; v=5.56; x=1810; b=1.66;
template &class T&
void printVec(vector &T& &v, string name = "v"){
cout && name && " = ";
for (int i=0; i&v.size(); ++i) cout && v[i] && " " ;
cout && '\n';
int main(){
const int N = 512;
vector &float& pos(N,5);
vector &Particle& p_all(N);
float * pos_
float * vel_
cudaMalloc( (void**) &pos_dev, sizeof(float)*N);
printVec(pos, "pos");
cudaMemcpy2D( (void*) &pos_dev, sizeof(float), (void*)&(p_all[0].x), sizeof(Particle), sizeof(float), N, cudaMemcpyHostToDevice);
getLastCudaError("HtoD");
cudaMemcpy( (void*) &pos[0], (void*)&pos_dev, N*sizeof(float), cudaMemcpyDeviceToHost);
getLastCudaError("DtoH");
printVec(pos, "pos_new");
解决方案 Your cudaMemcpy2D call is set up incorrectly.
Check the .
try this instead:
cudaMemcpy2D( (void*) pos_dev, sizeof(float), (void*)&(p_all[0].x), sizeof(Particle), sizeof(float), 512, cudaMemcpyHostToDevice);
There were multiple parameters that needed to be modified, but the invalid pitch error came about because the requested width of transfer in bytes (you had sizeof(Particle)) was wider than the destination pitch (sizeof(float), which is correct)
EDIT: in addition, although you didn't ask about it, the final cudaMemcpy operation in the code you have now posted is also incorrect.
The following changes should help:
cudaMemcpy( (void*) &(pos[0]), (void*)pos_dev, N*sizeof(float), cudaMemcpyDeviceToHost);
本文地址: &
我使用CUDA。我对主机的以下类: 类粒子{
//其他几个变量} 然后,我有颗粒的载体 矢量&粒子技术与GT; p_all(512); 在GPU上,我想所有的x的数组(从所有的粒子所)进行操作,并希望将数据从粒子阵列复制到设备上的一个float数组。我有cudaMemcpy可以用一种预感,我尝试了以下code,但它给无效螺距误差。
cudaMalloc((无效**)及pos_dev,sizeof的(浮动)* 512);cudaMemcpy2D((无效*)及pos_dev,sizeof的(浮),(无效*)及p_all [0] .X,sizeof的(粒子)的sizeof(粒子),512 * sizeof的(浮动),cudaMemcpyHostToDevice); 这是在所有可能这样做?当然,备份解决方案是创建使用for循环X的数组,然后将其复制到设备。但我期待一个更有效的解决方案。感谢。 FULL code所示。 的#include< cuda_runtime.h>#包括LT&;&iostream的GT;#包括LT&;矢量>使用命名空间//这会输出调用cudaGetLastError时正确错误字符串无效getLastCudaError(字符串s =“”){
字符串errMessage = S;
cudaError_t ERR = cudaGetLastError();
如果(ERR!= cudaSuccess){
CERR<< __FILE__<< “(”<<&__LINE__ LT;<“):去年Cuda的错误 - ”<< errMessage
<< “(”<< INT(ERR)LT;<“):”<< cudaGetErrorString(ERR)LT;< “\\ n”;
出口(-1);
int类型的;
A = 1988; c ='A'; V = 5.56; X = 1810; B = 1.66;
}};模板<类T>无效printVec(矢量& T>&安培; V,字符串名称=“V”){
COUT<<命名<< “=”;
的for(int i = 0; I< v.size(); ++ I)COUT<< v [1]
- ;&下; “”;
COUT<<的'\\ n';}诠释主(){
const int的N = 512;
矢量&浮球GT; POS(N,5);
矢量&颗粒> p_all(N);
cudaMalloc((无效**)及pos_dev,sizeof的(浮动)* N);
printVec(POS,“POS”);
cudaMemcpy2D((无效*)及pos_dev,sizeof的(浮),(无效*)及(p_all [0] .X)的sizeof(粒子)的sizeof(浮动),N,cudaMemcpyHostToDevice);
getLastCudaError(“HtoD”);
cudaMemcpy((无效*)及POS [0],(无效*)及pos_dev,N *的sizeof(浮动),cudaMemcpyDeviceToHost);
getLastCudaError(“DtoH”);
printVec(POS,“pos_new”);
返回0;} 解决方案 您 cudaMemcpy2D 通话设置不正确。检查文档。试试这个来代替:
cudaMemcpy2D((无效*)pos_dev,sizeof的(浮),(无效*)及(p_all [0] .X)的sizeof(粒子)的sizeof(浮动) 512,cudaMemcpyHostToDevice); 有一些需要修改多个参数,但无效螺距误差出现,因为在字节传输的请求宽度(你有的sizeof(粒子))是比目标间距大(的sizeof(浮动),这是正确的) 编辑:此外,虽然你c您现在有没有问一下,在$ C $最后 cudaMemcpy 操作发布也是不正确的。下面的变化应该有所帮助:
cudaMemcpy((无效*)及(POS [0]),(无效*)pos_dev,N *的sizeof(浮动),cudaMemcpyDeviceToHost);
本文地址: &
扫一扫关注官方微信豆丁微信公众号
君,已阅读到文档的结尾了呢~~
二维DFT并行算法在CUDA架构上的实现,dft算法,二维dft,二维dft变换的公式,二维码算法,并行算法实践,并行算法,二维码生成算法,算法并行化,二维码解码算法,二维码识别算法
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
二维DFT并行算法在CUDA架构上的实现
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 媒体矩阵控制主机 的文章

 

随机推荐