Member 14172841 Ответов: 2

Мне нужна помощь в создании кода cuda для продукта kronecker. Кто-нибудь может помочь?


может ли кто-нибудь преобразовать этот код c в cuda??
// C code to find the Kronecker Product of two 
// matrices and stores it as matrix C 
#include <stdio.h> 

// rowa and cola are no of rows and columns 
// of matrix A 
// rowb and colb are no of rows and columns 
// of matrix B 
const int cola = 2, rowa = 3, colb = 3, rowb = 2; 

// Function to computes the Kronecker Product 
// of two matrices 
void Kroneckerproduct(int A[][cola], int B[][colb]) 
{ 

	int C[rowa * rowb][cola * colb]; 

	// i loops till rowa 
	for (int i = 0; i < rowa; i++) { 

		// k loops till rowb 
		for (int k = 0; k < rowb; k++) { 

			// j loops till cola 
			for (int j = 0; j < cola; j++) { 

				// l loops till colb 
				for (int l = 0; l < colb; l++) { 

					// Each element of matrix A is 
					// multiplied by whole Matrix B 
					// resp and stored as Matrix C 
					C[i + l + 1][j + k + 1] = A[i][j] * B[k][l]; 
					printf("%d\t", C[i + l + 1][j + k + 1]); 
				} 
			} 
			printf("\n"); 
		} 
	} 
} 

// Driver Code 
int main() 
{ 
	int A[3][2] = { { 1, 2 }, { 3, 4 }, { 1, 0 } }, 
		B[2][3] = { { 0, 5, 2 }, { 6, 7, 3 } }; 

	Kroneckerproduct(A, B); 
	return 0; 
} 


Что я уже пробовал:

Я пытался в течение нескольких дней, но всегда есть некоторые ошибки и предупреждения. какая-то ошибка MSB3721 всегда есть

Richard MacCutchan

Пока вы не покажете нам предупреждения, мы не сможем догадаться, в чем проблема.

Stefan_Lang

Шаг 1: Избавьтесь от операторов printf!
Шаг 2: посмотрите документацию на наличие ошибок, которые вы получаете, и проверьте код в указанной позиции
Шаг 3: покажите код, который вызывает ошибку. Никто не сможет объяснить вам, что вы сделали не так, если вы не покажете нам, что вы сделали в первую очередь.

Вот и все:
Я не вижу смысла преобразовывать это в CUDA или любой другой вид параллельного кода: усилия по синхронизации съедят тривиальное количество времени обработки, которое вы сэкономите для вычислений. Распараллеливание имеет смысл только тогда, когда у вас есть значительный объем обработки между событиями синхронизации.

Rick York

Попробуйте поискать в интернете. Есть большая вероятность, что кто-то уже сделал это. Я сделал быстрый поиск, и несколько вещей выскочили.

Kornfeld Eliyahu Peter

Все MSB3721 означает, что ваш компилятор nvcc потерпел неудачу, но фактические детали скрыты в вашем окне вывода... Однако очень возможно, что без увеличения многословия ВС его вообще не покажут... Так что сделайте это и перекомпилируйте...
Ошибка непосредственно перед MSB3721 даст вам подсказку - погуглите ее...

2 Ответов

Рейтинг:
2

Michael Haephrati

Я протестировал ваш код с помощью Visual Studio 2017 Ultimate, и там нет никаких предупреждений или проблем.

1. Создайте консольное приложение
2. Поместите следующий код в ваш основной файл .cpp

// Test1.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include "pch.h"
#include <iostream>

// C code to find the Kronecker Product of two 
// matrices and stores it as matrix C 
#include <stdio.h> 

// rowa and cola are no of rows and columns 
// of matrix A 
// rowb and colb are no of rows and columns 
// of matrix B 
const int cola = 2, rowa = 3, colb = 3, rowb = 2;

// Function to computes the Kronecker Product 
// of two matrices 
void Kroneckerproduct(int A[][cola], int B[][colb])
{

	int C[rowa * rowb][cola * colb];

	// i loops till rowa 
	for (int i = 0; i < rowa; i++) {

		// k loops till rowb 
		for (int k = 0; k < rowb; k++) {

			// j loops till cola 
			for (int j = 0; j < cola; j++) {

				// l loops till colb 
				for (int l = 0; l < colb; l++) {

					// Each element of matrix A is 
					// multiplied by whole Matrix B 
					// resp and stored as Matrix C 
					C[i + l + 1][j + k + 1] = A[i][j] * B[k][l];
					printf("%d\t", C[i + l + 1][j + k + 1]);
				}
			}
			printf("\n");
		}
	}
}

// Driver Code 
int main()
{
	int A[3][2] = { { 1, 2 }, { 3, 4 }, { 1, 0 } },
		B[2][3] = { { 0, 5, 2 }, { 6, 7, 3 } };

	Kroneckerproduct(A, B);
	return 0;
}


Stefan_Lang

Проблемы были не с кодом, как он был опубликован, а с попытками преобразовать их в CUDA.

Michael Haephrati

Извиняюсь. Моя вина

Рейтинг:
1

Stefan_Lang

Вы все еще не опубликовали код, вызывающий ошибки, и полный текст ошибки (хотя в случае MSB3721 это может быть бесполезно - это общий код ошибки).

Я могу только сказать, что индекс, который вы используете для назначения элементов в C, неверен! Вы можете не верить в это, так как ваша программа выдает правильный результат, но это только потому, что вы печатаете каждую ячейку C сразу после ее вычисления, используя то же самое неправильное значение индекса, и, очевидно, до того, как есть шанс, что она будет перезаписана!

То, что код не может функционировать, легко увидеть: минимальные значения inde, используемые для C в этом коде, равны 1, как для строк, так и для столбцов, поэтому первая строка и столбец никогда не назначаются! Кроме того, самыми большими значениями индекса являются 2+3+1=6 и 3+2+1=6, поэтому некоторые значения записываются в случайную память, вызывая неопределенное поведение.

Вы можете проверить фактическое содержимое C, если добавите следующий цикл к функции KroneckerProduct():

for (int i=0; i < 6; ++i) {
    printf("\n");
    for (int j=0; j < 6; ++j) {
        printf("%d\t", C[i][j]);
    }
}

Вы получите что-то вроде этого:
-971846352      32519   -343317296      32767   -971795976      32519                                                       
64550200        0       6       12      -965645592      32519                                                               
0       0       18      24      -965709824      32519                                                                       
4195187 0       6       0       4195096 0                                                                                   
0       5       7       0       0       0                                                                                   
-343317112      2       3       0       -965708464      32519                                                               

Правильная функция продукта должна быть примерно такой:
for (int i = 0; i < rowa*rowb; ++i) {
    int ai = i/rowb;
    int bi = i%rowb;
    for (int j = 0; j < cola*colb; ++j) {
        int aj = j/colb;
        int bj = j%colb;
        C[i][j] = A[ai][aj]*B[bi][bj];
    }
}

Это даст правильный результат:
0       5       2       0       10      4                                                                                 
6       7       3       12      14      6                                                                                 
0       15      6       0       20      8                                                                                 
18      21      9       24      28      12                                                                                
0       5       2       0       0       0                                                                                 
6       7       3       0       0       0