如何在Cuda的設備內存中分配和傳輸(與主機)二維數組?在CUDA的設備內存上分配二維數組
18
A
回答
16
我找到了解決這個問題的方法。我不必將陣列弄平。
內置的cudaMallocPitch()
功能完成了這項工作。我可以使用cudaMemcpy2D()
函數將數組傳輸到設備和從設備傳輸數組。
例如
cudaMallocPitch((void**) &array, &pitch, a*sizeof(float), b);
這產生大小的2D陣列A * B與作爲傳遞作爲參數的音高。
以下代碼將創建一個2D數組並循環遍歷這些元素。它很容易編譯,你可以使用它。
#include<stdio.h>
#include<cuda.h>
#define height 50
#define width 50
// Device code
__global__ void kernel(float* devPtr, int pitch)
{
for (int r = 0; r < height; ++r) {
float* row = (float*)((char*)devPtr + r * pitch);
for (int c = 0; c < width; ++c) {
float element = row[c];
}
}
}
//Host Code
int main()
{
float* devPtr;
size_t pitch;
cudaMallocPitch((void**)&devPtr, &pitch, width * sizeof(float), height);
kernel<<<100, 512>>>(devPtr, pitch);
return 0;
}
3
展平:使其成爲一維。看看它是如何完成的here
2
您的設備代碼可能會更快。嘗試使用更多的線程。
__global__ void kernel(float* devPtr, int pitch)
{
int r = threadIdx.x;
float* row = (float*)((char*)devPtr + r * pitch);
for (int c = 0; c < width; ++c) {
float element = row[c];
}
}
然後,您計算適當的塊和線程分配,以便每個線程處理單個元素。
+0
Gitmo發佈的代碼是來自文檔的無用示例。是的,你的版本更快,但是你如何在行和列上並行執行此操作?嚴格地說,你可能會在你的手中亂七八糟,因爲你不檢查「r」是否小於實際的行數 – pelesl 2014-06-19 00:25:47
相關問題
- 1. 動態內存分配 - 二維數組
- 2. 分配內存到二維數組
- 3. 設備內存上的多個指針爲單個分配數組在cuda
- 4. CUDA二維數組
- 5. 二維數組的連續內存分配---釋放內存
- 6. C++動態分配二維數組過度分配內存?
- 7. 如何在CUDA中將設備內存分配給我的指針數組?
- 8. 如何將二維數組的一部分分配給CUDA流?
- 9. CUDA中的二維數組
- 10. 在CUDA設備中的內存分配不是預期的
- 11. CUDA全局(如C語言)分配給設備內存的動態數組
- 12. 取消分配這個特定的二維數組的內存
- 13. 分配二維數組ç
- 14. 分配二維數組
- 15. 二維數組CUDA 2D紋理CUDA
- 16. 內存分配。二維數組(無效函數)
- 17. gpuocelot是否支持CUDA設備中的動態內存分配?
- 18. 設備內存刷新cuda
- 19. 複製到CUDA到設備內存CUDA
- 20. CUDA-Fortran設備數據結構中的可分配數組
- 21. 在C的結構內包裹着指針的二維數組分配內存
- 22. 二維數組(矩陣)內存分配問題
- 23. 二維數組錯誤:矢量索引超出內存分配
- 24. 爲多維數組分配內存
- 25. 在C中分配二維數組中的一維數組#
- 26. CUDA內存分配用於主機和設備
- 27. 二維動態內存分配 - ObjectiveC
- 28. CUDA在設備上靜態分配數據
- 29. 在CUDA中,如何將設備指針數組複製到設備內存?
- 30. 正確的內存分配在一個類中的二維數組在C++
稍後可以爲數組分配一個新行嗎? – scatman 2011-04-12 06:08:32