我正在使用CUSP库在CUDA机器上进行稀疏矩阵乘法.我目前的代码是
#include <cusp/coo_matrix.h>
#include <cusp/multiply.h>
#include <cusp/print.h>
#include <cusp/transpose.h>
#include<stdio.h>
#define CATAGORY_PER_SCAN 1000
#define TOTAL_CATAGORY 100000
#define MAX_SIZE 1000000
#define ELEMENTS_PER_CATAGORY 10000
#define ELEMENTS_PER_TEST_CATAGORY 1000
#define INPUT_VECTOR 1000
#define TOTAL_ELEMENTS ELEMENTS_PER_CATAGORY * CATAGORY_PER_SCAN
#define TOTAL_TEST_ELEMENTS ELEMENTS_PER_TEST_CATAGORY * INPUT_VECTOR
int main(void)
{
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start, 0);
cusp::coo_matrix<long long int, double, cusp::host_memory> A(CATAGORY_PER_SCAN,MAX_SIZE,TOTAL_ELEMENTS);
cusp::coo_matrix<long long int, double, cusp::host_memory> B(MAX_SIZE,INPUT_VECTOR,TOTAL_TEST_ELEMENTS);
for(int i=0; i< ELEMENTS_PER_TEST_CATAGORY;i++){
for(int j = 0;j< INPUT_VECTOR ; j++){
int index = i * INPUT_VECTOR + j ;
B.row_indices[index] = i; B.column_indices[ index ] = j; B.values[index ] = i;
}
}
for(int i = 0;i < CATAGORY_PER_SCAN; i++){
for(int j=0; j< ELEMENTS_PER_CATAGORY;j++){
int index = i * ELEMENTS_PER_CATAGORY + j ;
A.row_indices[index] = i; A.column_indices[ index ] = j; A.values[index ] = i;
}
}
/*cusp::print(A);
cusp::print(B); */
//test vector
cusp::coo_matrix<long int, double, cusp::device_memory> A_d = A;
cusp::coo_matrix<long int, double, cusp::device_memory> B_d = B;
// allocate output vector
cusp::coo_matrix<int, double, cusp::device_memory> y_d(CATAGORY_PER_SCAN, INPUT_VECTOR ,CATAGORY_PER_SCAN * INPUT_VECTOR);
cusp::multiply(A_d, B_d, y_d);
cusp::coo_matrix<int, double, cusp::host_memory> y=y_d;
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
float elapsedTime;
cudaEventElapsedTime(&elapsedTime, start, stop); // that's our time!
printf("time elaplsed %f ms\n",elapsedTime);
return 0;
}
提示::乘法功能只使用1个GPU (据我理解)。
发布于 2012-09-19 07:44:18
1如何使用setDevice()在两个GPU上运行相同的程序
如果您的意思是“如何使用两个GPU执行单个cusp::multiply
操作”,答案是您不能。
编辑:
对于希望在不同GPU上运行两个单独的CUSP稀疏矩阵矩阵产品的情况,可以简单地将操作封装在一个循环中,并在传输和cudaSetDevice
调用之前调用cusp::multiply
。但是,这样做可能不会加快速度。我认为我说得对,内存传输和cusp::multiply
操作都是阻塞调用的,所以主机CPU会暂停,直到它们完成为止。因此,对不同GPU的调用不能重叠,在单个GPU上执行同一操作两次不会加快速度。如果您愿意使用多线程应用程序,并且有一个具有多个核的主机CPU,那么您可能仍然可以并行运行它们,但它不会像您所期望的那样简单。
2准确测量总时间。
您现在拥有的cuda_event
方法是度量单个内核执行时间的最精确方法。如果您有一个简单的多GPU方案,那么来自每个GPU上下文的事件之和将是内核的总执行时间。如果总时间是指完成操作的“挂钟”时间,那么您需要在代码的整个multigpu段周围使用主机计时器。我隐约记得,在CUDA的最新版本中,在某些情况下可能会在不同上下文的流中同步事件,因此基于CUDA事件的计时器在这种情况下仍然可以使用。
如何在这个库中使用零拷贝固定内存,就像我自己可以使用malloc一样。
据我所知,这是不可能的。底层推力库CUSP可以支持使用零拷贝内存的容器,但是CUSP不公开标准矩阵构造函数中的必要机制,以便能够在零拷贝内存中分配CUSP稀疏矩阵。
https://stackoverflow.com/questions/12494527
复制