سؤال

وكيف يمكنني تخصيص ونقل (من وإلى المضيف) صفائف 2D في ذاكرة الجهاز في كودا؟

هل كانت مفيدة؟

المحلول

ولقد وجدت حل لهذه المشكلة. لم يكن لدي لشد مجموعة.

وظيفة cudaMallocPitch() يحمل في ثناياه عوامل فعلت هذا المنصب. وأنا لا يمكن نقل مجموعة من وإلى الجهاز باستخدام وظيفة cudaMemcpy2D().

وعلى سبيل المثال

cudaMallocPitch((void**) &array, &pitch, a*sizeof(float), b);

وهذا يخلق مجموعة 2D من حجم أ ب * مع الملعب كما مر في كمعلمة.

والتعليمة البرمجية التالية يخلق مجموعة 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;
}

نصائح أخرى

وتمهيدها: جعلها ذات بعد واحد. انظر كيف يتم ذلك هنا

وكود الجهاز يمكن أن يكون أسرع. محاولة الاستفادة من المواضيع أكثر.

__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];
    }
}

وبعد ذلك يمكنك حساب المناسبة الكتل والمواضيع تخصيص بحيث يكون كل موضوع يتناول عنصر واحد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top