[問題] CUDA C pointer resize的問題

看板C_and_CPP (C/C++)作者 (沒看過新手喔)時間12年前 (2013/12/06 16:57), 編輯推噓0(0033)
留言33則, 2人參與, 最新討論串1/1
開發平台(Platform): VS2010 + CUDA5.5 額外使用到的函數庫(Library Used): CUDA5.5 問題(Question): 如果使用fix size的array就可以執行 如果是先宣告pointer , 再malloc空間給該pointer , 結果會錯 餵入的資料(Input):預期的正確結果(Expected Output): 單純相加 錯誤結果(Wrong Output): 輸出的時候error 程式碼(Code): 這兩頁是pointer的code , 可以執行 執行到一半回傳error http://pastie.org/8532827 http://pastie.org/8532829 這兩頁是fix size的array , 可以執行 結果正確 http://pastie.org/8532835 http://pastie.org/8532836 兩篇差別 , 除了pointer和fix size array , 大概就差註解和宣告而已 補充說明(Supplement): 初學cuda , 希望有人可以幫忙解這個問題或是告知我哪裡錯誤 目前正在寫的code會隨輸入而改變array size , 不可能寫成fix size 我是用pointer這個辦法寫 , 可是這樣執行結果不正確 麻煩如果有人知道或遇過這個問題可以跟我講解法 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.48.85

12/06 17:12, , 1F
你說的 pointer 是什麼? 看不懂
12/06 17:12, 1F

12/06 17:13, , 2F
是指 array_t 嗎
12/06 17:13, 2F

12/06 17:15, , 3F
不是 是指array_t裡面的 a
12/06 17:15, 3F

12/06 17:15, , 4F
兩份code差別就是一個是a[5] 一個是*a
12/06 17:15, 4F

12/06 17:15, , 5F
*a 可以執行 結果回傳error
12/06 17:15, 5F

12/06 17:15, , 6F
a[5]執行結果正確
12/06 17:15, 6F

12/06 17:16, , 7F
就寫錯了. 你是用 cudaMemcpy, 但指向的東西沒放在那.
12/06 17:16, 7F

12/06 17:17, , 8F
簡單說是要改成 cudaMemcpy(a->a, dev_c, .. )之類的
12/06 17:17, 8F

12/06 17:18, , 9F
而且這個 array_t 的設計目的有點奇怪
12/06 17:18, 9F

12/06 17:19, , 10F
這只是我來表示我的問題的地方
12/06 17:19, 10F

12/06 17:20, , 11F
所以你覺得是這個問題嗎?
12/06 17:20, 11F

12/06 17:20, , 12F
表示問題的寫法 可是如果寫成那樣 a->a和dev_c型別不同
12/06 17:20, 12F

12/06 17:21, , 13F
就是我遇到問題 但是原本code太大 我用sample code改的
12/06 17:21, 13F

12/06 17:22, , 14F
所以你打算在 cuda 裡面用 array_t 的意思?
12/06 17:22, 14F

12/06 17:23, , 15F
簡單說, 就是 copy 過去需要 copy 兩個部分
12/06 17:23, 15F

12/06 17:23, , 16F
不是 只是有差不多的class 包含一個指向array的pointer
12/06 17:23, 16F

12/06 17:23, , 17F
array_t 跟 array_t 裡 a 指向的空間
12/06 17:23, 17F

12/06 17:24, , 18F
你先想清楚你要幹嘛好了....
12/06 17:24, 18F

12/06 17:24, , 19F
所以該個class裡面所有的data都要用這指令copy一次?
12/06 17:24, 19F

12/06 17:24, , 20F
"差不多" 的 class 是差多少阿.. (窘)
12/06 17:24, 20F

12/06 17:25, , 21F
你 array_t 裡面的去指向的東西不包含在 array_t
12/06 17:25, 21F

12/06 17:25, , 22F
所以所有額外 "動態" 配置的東西都要另外 copy
12/06 17:25, 22F

12/06 17:26, , 23F
而且不只 copy, 還要確定在 device 裡面的 pointer 正確
12/06 17:26, 23F

12/06 17:26, , 24F
這跟一般 C++ Rule of Three 是一樣的情況
12/06 17:26, 24F

12/06 17:26, , 25F
那該pointer copy出來以後要重新指向嗎?
12/06 17:26, 25F

12/06 17:26, , 26F
你要實現複製語意, 只是是在 Host to Device 上實現
12/06 17:26, 26F

12/06 17:27, , 27F
流程應該是 dev_a 指向 cuda 配置的 array_T
12/06 17:27, 27F

12/06 17:28, , 28F
該 dev_a 裡面的 a 要指向另外再 cuda malloc 的 int 陣列
12/06 17:28, 28F

12/06 17:28, , 29F
然後在 cuda memcpy
12/06 17:28, 29F

12/06 17:30, , 30F
那我要怎麼讓dev_a裡面的 a 指向int陣列 跟c一樣就可以?
12/06 17:30, 30F

12/06 17:31, , 31F
還是有使用另外的語法
12/06 17:31, 31F

12/06 17:31, , 32F
你怎麼讓 dev_a 指向 array_t ? 這是一樣的問題
12/06 17:31, 32F

12/06 17:33, , 33F
好的我想我知道怎麼改了 謝謝
12/06 17:33, 33F
文章代碼(AID): #1IeP5SqK (C_and_CPP)
文章代碼(AID): #1IeP5SqK (C_and_CPP)