再请教各位高手个问题

时间:2021-09-28 18:51:26
再请教个问题
如何 能 在host 分配 二维内存空间

不能的话 mallloc 分配的 的 一惟 空间 怎么 传到 cudamallocpitch 分配的 二维空间去

 指向cudamallocpitch 分配的 二维空间的指针  是不是可以 用 双下标访问 就象二惟数组一样
 pitch 到底指什么的长度?

  

5 个解决方案

#1


知道的大侠讲讲呀

#2


 cudaError_t cudaMallocPitch  ( void **  devPtr,  
  size_t *  pitch,  
  size_t  width,  
  size_t  height   
 )    

Allocates at least width (in bytes) * height bytes of linear memory on the device and returns in *devPtr a pointer to the allocated memory. The function may pad the allocation to ensure that corresponding pointers in any given row will continue to meet the alignment requirements for coalescing as the address is updated from row to row. The pitch returned in *pitch by cudaMallocPitch() is the width in bytes of the allocation. The intended usage of pitch is as a separate parameter of the allocation, used to compute addresses within the 2D array. Given the row and column of an array element of type T, the address is computed as: 

    T* pElement = (T*)((char*)BaseAddress + Row * pitch) + Column;

For allocations of 2D arrays, it is recommended that programmers consider performing pitch allocations using cudaMallocPitch(). Due to pitch alignment restrictions in the hardware, this is especially true if the application will be performing 2D memory copies between different regions of device memory (whether linear memory or CUDA arrays).


Parameters:
 devPtr  - Pointer to allocated pitched device memory  
 pitch  - Pitch for allocation  
 width  - Requested pitched allocation width (in bytes)  
 height  - Requested pitched allocation height 
 

#3


主机和gpu上的区别就是pitch不同。主机上每行之间没填充字节(是连续存放的)。
cudaError_t cudaMemcpy2D  ( void *  dst,  
  size_t  dpitch,  
  const void *  src,  
  size_t  spitch,  
  size_t  width,  
  size_t  height,  
  enum cudaMemcpyKind  kind   
 )    

Copies a matrix (height rows of width bytes each) from the memory area pointed to by src to the memory area pointed to by dst, where kind is one of cudaMemcpyHostToHost, cudaMemcpyHostToDevice, cudaMemcpyDeviceToHost, or cudaMemcpyDeviceToDevice, and specifies the direction of the copy. dpitch and spitch are the widths in memory in bytes of the 2D arrays pointed to by dst and src, including any padding added to the end of each row. The memory areas may not overlap. width must not exceed either dpitch or spitch. Calling cudaMemcpy2D() with dst and src pointers that do not match the direction of the copy results in an undefined behavior. cudaMemcpy2D() returns an error if dpitch or spitch exceeds the maximum allowed.


Parameters:
 dst  - Destination memory address  
 dpitch  - Pitch of destination memory  
 src  - Source memory address  
 spitch  - Pitch of source memory  
 width  - Width of matrix transfer (columns in bytes)  
 height  - Height of matrix transfer (rows)  
 kind  - Type of transfer 

#4


我也被这个问题纠结着……
受教了~~

#5


该回复于2010-11-09 13:19:26被版主删除

#1


知道的大侠讲讲呀

#2


 cudaError_t cudaMallocPitch  ( void **  devPtr,  
  size_t *  pitch,  
  size_t  width,  
  size_t  height   
 )    

Allocates at least width (in bytes) * height bytes of linear memory on the device and returns in *devPtr a pointer to the allocated memory. The function may pad the allocation to ensure that corresponding pointers in any given row will continue to meet the alignment requirements for coalescing as the address is updated from row to row. The pitch returned in *pitch by cudaMallocPitch() is the width in bytes of the allocation. The intended usage of pitch is as a separate parameter of the allocation, used to compute addresses within the 2D array. Given the row and column of an array element of type T, the address is computed as: 

    T* pElement = (T*)((char*)BaseAddress + Row * pitch) + Column;

For allocations of 2D arrays, it is recommended that programmers consider performing pitch allocations using cudaMallocPitch(). Due to pitch alignment restrictions in the hardware, this is especially true if the application will be performing 2D memory copies between different regions of device memory (whether linear memory or CUDA arrays).


Parameters:
 devPtr  - Pointer to allocated pitched device memory  
 pitch  - Pitch for allocation  
 width  - Requested pitched allocation width (in bytes)  
 height  - Requested pitched allocation height 
 

#3


主机和gpu上的区别就是pitch不同。主机上每行之间没填充字节(是连续存放的)。
cudaError_t cudaMemcpy2D  ( void *  dst,  
  size_t  dpitch,  
  const void *  src,  
  size_t  spitch,  
  size_t  width,  
  size_t  height,  
  enum cudaMemcpyKind  kind   
 )    

Copies a matrix (height rows of width bytes each) from the memory area pointed to by src to the memory area pointed to by dst, where kind is one of cudaMemcpyHostToHost, cudaMemcpyHostToDevice, cudaMemcpyDeviceToHost, or cudaMemcpyDeviceToDevice, and specifies the direction of the copy. dpitch and spitch are the widths in memory in bytes of the 2D arrays pointed to by dst and src, including any padding added to the end of each row. The memory areas may not overlap. width must not exceed either dpitch or spitch. Calling cudaMemcpy2D() with dst and src pointers that do not match the direction of the copy results in an undefined behavior. cudaMemcpy2D() returns an error if dpitch or spitch exceeds the maximum allowed.


Parameters:
 dst  - Destination memory address  
 dpitch  - Pitch of destination memory  
 src  - Source memory address  
 spitch  - Pitch of source memory  
 width  - Width of matrix transfer (columns in bytes)  
 height  - Height of matrix transfer (rows)  
 kind  - Type of transfer 

#4


我也被这个问题纠结着……
受教了~~

#5


该回复于2010-11-09 13:19:26被版主删除