system
1
你好:以下是我程式碼的一部份:
int w=720;
int h=540
int N=w*h;
unsigned char **y= new unsigned char *[h];
for(m=0;m<h;m++)
{
y[m]= new unsigned char[w];
}
unsigned char **d_y;
cudaMalloc((void**)&d_y,Nsizeof(unsigned char));
cudaMemcpy(d_y,y,Nsizeof(unsigned char),cudaMemcpyHostToDevice);
我想問的是: 我host的y是二維陣列想用二維的d_y來複製,但是這樣用cudaMalloc和cudaMemcpy好像會出錯。
是否有別的方法來設定d_y?還是一定要把它想成一維的方式來做?
system
2
LZ您好:
建议使用连续缓冲区的,以及对连续缓冲区您可以自己计算一维化的index以便寻址,也可以使用带有维度信息的指针来实现自动计算寻址,两者效率相当。
您可以参考论坛以前的讨论帖:
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=7056&extra=page%3D1
感谢您深夜造访论坛,祝您编码顺利~
system
3
楼主你好:
您的用法有误,cudaMemcpy需要一个连续的缓冲区的首地址的,而不是一堆缓冲区的首地址构成的数组的地址。
cudaMemcpy无法自动合并复制他们。
请您一次性分配足够的缓冲区(h * w个字节), 而不是一次w个,分配h次。
感谢您莅临。
system
4
真不好意思 又有問題想要問你們了
你說的cudaMemcpy用法有錯誤,我有點不太懂,
cudaMemcpy(d_y,y,Nsizeof(unsigned char),cudaMemcpyHostToDevice);
是要把N改成wh?? 不過我的N上面已經有設定N=w*h了,之後我把它全部改成一維的算法後,用cudaError_t檢查有沒有錯 結果在出現了 unknown error 是這我在cudaMemcpy這邊出問題了嗎?
system
5
一次cudaMemcpy传输需要2个缓冲区的,
他们分别被称为源缓冲区和目标缓冲区,
这2个缓冲区都要求是线性的。
所以楼主您的显存上的分配,N(w*h)个字节固然很好,
但同样的,您也需要将您的host上的缓冲区分配正确。
请您将您的unsigned char **y开头的到cudaMalloc之间的部分,改成:
unsigned char *y = (unsigned char *)malloc(h * w);
而不是您原来的那样,分配h次,每次w字节。
请您知晓并尝试这点。
关于您的第二个问题,您如果有cudaErrorUnknown, 一般代表您的kernel有越界,请您检查您的下表计算都正确,并且缓冲区长度满足您的意图。(您可以使用nsight自动发现出错的行)
感谢您的夜间莅临。
system
6
恩,謝謝
我安裝的是cuda5.5 nsight 因該是有包含在裡面,不過我nsight的燈是黑色的,跟一般的綠色燈號好像不一樣,還是要去下載 nsight 的安裝檔重新安裝他才會啟動?